java面向对象设计原则之合成复用原则示例详解

 更新时间:2021年10月14日 09:51:44   作者:guoyp2126  
这篇文章主要介绍了java面向对象设计原则之合成复用原则的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

概念

尽量使用合成/聚合,而不是使用继承实现复用。所谓的合成/聚合是指一个对象里持有另外一个类的对象,通过调用这些对象的方法得到复用已有功能的目的。如:报文解译程序中,按照继承复用可以设计为:

在这里插入图片描述

子类调用父类的方法即可完成水文报文解译、气象解译中通用方法;子类中一定包含了父类的方法,这个叫继承复用。

按照合成/聚合原则设计为:

在这里插入图片描述

水文协议和气象协议中,持有编码和位制转换对象,通过调用对象方法即可完成复用。

示例

数据库连接的复用:首先看通过集成关系复用数据连接代码如下

public class SqlServerConnect {
    private Connection con = null;
    public Connection getCon() {
        System.out.println("创建数据库连接");
        return con;
    }
}
public class UserDao extends SqlServerConnect {
   //继承复用连接数据
    public void queryData()
    {
        Connection con =getCon();
        String sql = "select * from emp";
        try {
            Statement statement = con.createStatement();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

UserDao继承了SqlServerConnect,复用了父类的getCon()方法;如果此时数据库不再使用SQLServer,要改成oracle,这种复用就无能为力了。
使用合成复用,代码可以修改为:

//增加一个接口
public interface DatabaseConnection {
    Connection getCon();
}
//SqlServerConnect实现该接口
public class SqlServerConnect implements DatabaseConnection {
    private Connection con = null;
    @Override
    public Connection getCon() {
        System.out.println("创建数据库连接");
        return con;
    }
}
//clsUserDaoNew和数据库连接接口呈现聚合关系,使用依赖倒置,可动态替换此类,复用了getCon()代码
public class UserDaoNew {
    private DatabaseConnection objCon;
    public UserDaoNew(DatabaseConnection conn){
        objCon = conn;
    }
    public void queryData() {
        Connection con = objCon.getCon();
        String sql = "select * from emp";
        try {
            Statement statement = con.createStatement();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

在UserDaoNew类中,通过使用聚合关系,通过构造注入一个数据连接对象,通过调用这个对象的getCon()方法实现复用。这种方式,利用里氏代换和依赖倒置原则,当使用SQLServer数据库时,注入SqlServerConnect实例,如果使用oracle数据库时,注入OrcaleConnect实例,代码更加灵活,实现动态复用。

拓展

1.继承是静态复用,通过聚合复用是动态复用。所谓的静态复用是在编码阶段已经明确了类之间的关系;动态复用则是在程序运行阶段,根据实际要求注入相应的对象完成复用的,动态复用比静态复用更具有灵活性。

2.合成复用原则还体现复用范围扩大了。如上图所示,使用继承关系,则BCD转ASCII码只服务报文解译,如一个加密程序也要使用BCD转ASCII、数据位制转换,就没办法使用。

以上就是java面向对象设计原则之合成复用原则示例详解的详细内容,更多关于java面向对象设计原则的资料请关注脚本之家其它相关文章!

相关文章

  • 解读Spring事务是如何实现的

    解读Spring事务是如何实现的

    这篇文章主要介绍了Spring事务是如何实现的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • JDK的命令详解

    JDK的命令详解

    JDK的命令详解...
    2006-12-12
  • IDEA中切换不同版本的JDK的详细教程(超管用)

    IDEA中切换不同版本的JDK的详细教程(超管用)

    这篇文章主要介绍了IDEA中切换不同版本的JDK的详细教程(超管用),本文通过步骤详解给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • Spring Boot 日志配置方法(超详细)

    Spring Boot 日志配置方法(超详细)

    默认情况下,Spring Boot会用Logback来记录日志,并用INFO级别输出到控制台。下面通过本文给大家介绍Spring Boot 日志配置方法详解,感兴趣的朋友参考下吧
    2017-07-07
  • java判断integer是否为空的详细过程

    java判断integer是否为空的详细过程

    在java编写过程中,我们会使用到各种各样的表达式,在使用表达式的过程中,有哪些安全问题需要我们注意的呢?对java判断integer是否为空相关知识感兴趣的朋友一起来看看吧
    2023-02-02
  • java常见事件响应方法实例汇总

    java常见事件响应方法实例汇总

    这篇文章主要介绍了java常见事件响应方法,对于初学者有很好的参考借鉴价值,分享给大家,需要的朋友可以参考下
    2014-08-08
  • SpringBoot实现国密SM4加密解密的使用示例

    SpringBoot实现国密SM4加密解密的使用示例

    在商用密码体系中,SM4主要用于数据加密,本文就来介绍一下SpringBoot实现国密SM4加密解密的使用示例,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • springboot操作静态资源文件的方法

    springboot操作静态资源文件的方法

    这篇文章主要介绍了springboot操作静态资源文件的方法,本文给大家提到了两种方法,小编在这里比较推荐第一种方法,具体内容详情大家跟随脚本之家小编一起看看吧
    2018-07-07
  • java实现图片转ascii字符画的方法示例

    java实现图片转ascii字符画的方法示例

    这篇文章主要介绍了java实现图片转ascii字符画的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • SpringBoot this调用@Bean效果详解

    SpringBoot this调用@Bean效果详解

    这篇文章主要介绍了在一个@Bean方法内,this调用同一个类的@Bean方法会有什么效果,我们可以通过bean的名称、bean的类型或者bean的名称+类型来获取容器中的bean
    2023-02-02

最新评论