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数据库连接";
    }
}

此篇完。

posted @   田园码民  阅读(134)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示