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

作者:guoyp2126 时间:2023-11-09 16:55:51 

概念

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

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

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

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

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、数据位制转换,就没办法使用。

来源:https://blog.csdn.net/guoyp2126/article/details/113946537

标签:面向对象,复用原则
0
投稿

猜你喜欢

  • 关于springboot配置文件密文解密方式

    2023-11-09 04:21:24
  • 如何使用JaCoCo分析java单元测试覆盖率

    2023-01-13 11:38:39
  • C#编译器对局部变量的优化指南

    2023-06-23 14:54:12
  • Springboot webscoket自定义定时器

    2023-02-12 05:34:02
  • Unity3D实现NavMesh导航网格寻路

    2021-07-29 05:38:18
  • QT5实现简单的TCP通信的实现

    2023-11-02 21:24:48
  • Android实现环形进度条代码

    2023-06-08 11:09:55
  • Java毕业设计实战之共享租车信息管理系统的实现

    2022-08-02 13:37:32
  • SpringCloud使用Zookeeper作为注册中心

    2023-11-21 20:28:20
  • C#集合之列表的用法

    2021-12-27 19:46:43
  • Java客户端利用Jedis操作redis缓存示例代码

    2021-05-31 03:43:42
  • java动态导出excel压缩成zip下载的方法

    2022-07-13 07:29:27
  • C#实现加密与解密详解

    2023-08-11 16:54:42
  • Android应用开发中CardView的初步使用指南

    2022-12-30 02:04:47
  • C# SQlite操作方法小结

    2021-10-01 15:56:09
  • Mybatis中xml的动态sql实现示例

    2023-11-29 17:09:36
  • JavaEE微框架Spring Boot深入解读

    2021-07-31 14:24:55
  • Java实战之敏感词过滤器

    2022-01-18 10:32:03
  • Android ProgressDialog使用总结

    2023-07-10 22:16:33
  • IDEA:Git stash 暂存分支修改的实现代码

    2023-11-29 09:16:35
  • asp之家 软件编程 m.aspxhome.com