【设计模式】软件设计七大原则 ( 合成复用原则 | 代码示例 )
文章目录
- 一、合成复用原则简介
- 二、合成复用 与 继承复用 优缺点
- 三、合成复用原则代码示例
- 1、继承复用代码示例
- 2、合成复用代码示例
一、合成复用原则简介
合成复用原则 又称为 组合复用原则 , 合成/聚合复用原则 , 组合/聚合复用原则 ;
合成复用原则定义 : 想要达到 软件复用 的目的 , 尽量使用 对象 组合/聚合 , 而不是 继承关系 ;
聚合 是 has-A 关系 ; ( 关系较弱 ) 代表部分事物的对象 ( 次 ) 与 代表聚合事物的对象 ( 主 ) 生命周期无关 , 删除了聚合对象 , 不代表删除了代表部分事物的对象 ;
组合 是 contains-A 关系 ; ( 关系较强 ) 一旦删除 代表组合事物的对象 ( 主 ) , 那么 代表部分事物的对象 ( 次 ) 也一起被删除 ;
继承 是 is-A 关系 ;
电脑 与 U 盘 是聚合关系 , 电脑没了 , U 盘可以独立存在 , 还可以接在其它电脑上 ;
A 类中包含了 B 类的引用 , 当 A 类对象销毁时 , B 类引用所指向的对象也一同消失 , 没有任何一个引用指向他 , 该引用成为了垃圾对象 , 被回收 ; 这种情况就是 组合 ;
加入 A 类销毁后 , B 类对象还有在其它位置被引用 , B 类对象不会被销毁 , 此时这种关系就是 聚合 ;
二、合成复用 与 继承复用 优缺点
合成复用优点 : 使系统 更加灵活 , 降低 类与类 之间的耦合度 , 一个类的变化对其他类造成的影响相对较少 ;
合成复用缺点 : 通过 组合 / 聚合 方式建造的系统 , 有较多的对象需要管理 ;
继承复用优点 : 扩展性容易实现 , 继承父类后 , 父类的所有功能都可以通过继承关系进入子类 , 修改和扩展都比较容易 ;
继承复用缺点 : 破坏包装 , 继承将父类的实现细节暴露给了子类 , 这种复用称为白箱复用 ;
继承复用 称为 白箱复用 , 组合 / 聚合 复用 称为 黑箱复用 ;
黑箱复用 看不到 , 如 A 类中包含 B 类 , A 看不到 B 的具体实现细节 ;
三、合成复用原则代码示例
1、继承复用代码示例
业务场景 : 向数据块中添加数据 ; 先获取数据库连接 , 然后向数据库中添加数据 ;
数据块链接类 :
package compositionaggregation;/*** 数据块连接*/ public class DBConnection {public String getConnection() {return "数据连接";} }增加数据类 :
package compositionaggregation;/*** 创造产品*/ public class ProductDao extends DBConnection {/*** 增加产品*/public void addProduct() {// 先获取连接String conn = super.getConnection();System.out.println("使用 " + conn + " 增加产品");} }测试类 :
package compositionaggregation;public class Main {public static void main(String[] args) {ProductDao productDao = new ProductDao();productDao.addProduct();} }执行结果 :
2、合成复用代码示例
数据库连接抽象类 :
package compositionaggregation;/*** 数据块连接*/ public abstract class DBConnection {public abstract String getConnection(); }Oracle 数据库连接类 :
package compositionaggregation;/*** Oracle 数据块连接*/ public class OracleConnection extends DBConnection {@Overridepublic String getConnection() {return "Oracle 数据库连接";} }MySQL 数据库连接类 :
package compositionaggregation;/*** MySQL 数据块连接*/ public class MySqlConnection extends DBConnection {@Overridepublic String getConnection() {return "MySQL 数据库连接";} }插入数据类 : 通过组合复用 , 注入数据库连接类 ;
package compositionaggregation;/*** 创造产品*/ public class ProductDao {/*** 通过组合方式注入数据库连接*/private DBConnection connection;public ProductDao(DBConnection connection) {this.connection = connection;}/*** 增加产品*/public void addProduct() {// 先获取连接String conn = connection.getConnection();System.out.println("使用 " + conn + " 增加产品");} }测试类 :
package compositionaggregation;public class Main {public static void main(String[] args) {ProductDao productDao = new ProductDao(new OracleConnection());productDao.addProduct();} }执行结果 :
《新程序员》:云原生和全面数字化实践50位技术专家共同创作,文字、视频、音频交互阅读总结
以上是生活随笔为你收集整理的【设计模式】软件设计七大原则 ( 合成复用原则 | 代码示例 )的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 【设计模式】软件设计七大原则 ( 里氏替
- 下一篇: 【设计模式】面向对象 - 多态 ( 面向