00_7面向对象设计原则-合成复用原则
定义:指尽量使用对象组合或对象聚合的方式实现代码复用,而不是用继承关系达到复用代码的目的。合成复用原则可以使系统更加灵活,降低类与类之间的耦合度,一个类的变化对其他类造成的影响相对较小。
继承,又被称为白箱复用,相当于把所有实现细节暴露给子类。组合/聚合又被称为黑箱复用。对类以外的对象是无法获取到实现细节的。我们要根据具体的业务场景来做代码设计。
来我们看一个案例,还是以数据库操作为例,首先创建DBConnection类:
package org.test.design.principle.carp; public class DBConnection { public String getConnection(){ return "MySQL数据库连接"; } }
创建ProductDao类:
package org.test.design.principle.carp; public class ProductDao { private DBConnection dbConnection; public void setDbConnection(DBConnection dbConnection) { this.dbConnection = dbConnection; } public void addProduct() { String conn = dbConnection.getConnection(); System.out.println("使用" + conn + "增加产品"); } }
这是一种非常典型的合成复用原则应用场景。但是,对于目前的设计来说,DBConnection还不是一种抽象,不便于系统扩展。目前的系统支持MySQL数据库连接,假设业务发生变化,数据库操作层要支持Oracle数据库。当然,我们可以在DBConnection中增加对Oracle数据库支持的方法,但是这违背了开闭原则。其实,可以不必须修改Dao的代码,将DBConnection修改为abstract,代码如下:
package org.test.design.principle.carp; public abstract class DBConnectionV2 { public abstract String getConnection(); }
然后将MySQL的逻辑抽离
package org.test.design.principle.carp; public class MySQLConnection extends DBConnectionV2{ @Override public String getConnection() { return "MySQL数据库连接"; } }
再创建Oracle支持的逻辑
package org.test.design.principle.carp; public class OracleConnection extends DBConnectionV2{ @Override public String getConnection() { return "Oracle数据库连接"; } }
此篇完。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端