设计原则 - 合成复用原则

概念

  • 定义:尽量使用对象组合(contains-A)/聚合(has-A),而不是继承关系达到软件复用的目的
  • 优点:可以使系统更加灵活,降低类与类之间的耦合度,一个类的变化对其他类造成的影响相对较少
  • 合成复用是达到开闭原则的一种实现方式

编码

实例

  • 数据库连接
  • DBConnection.java
/**
 * @Description DB连接
 * @date Dec 19, 2021
 * @version 1.0
 */
public class DBConnection {

	/**
     * 获取DB连接
     * @return
     */
    public String getConnection() {
        return "Mysql数据库连接";
    }

}
  • ProductDao.java
/**
 * @Description 产品DAO
 * @date Dec 19, 2021
 * @version 1.0
 */
public class ProductDao extends DBConnection {

    /**
     * 添加产品
     */
    public void addProduct() {
        String conn = super.getConnection();
        System.out.println("使用" + conn + "增加产品");
    }

}
  • Test.java
/**
 * @Description 测试类
 * @date Dec 19, 2021
 * @version 1.0
 */
public class Test {

    public static void main(String[] args) {
        ProductDao productDao = new ProductDao();
        productDao.addProduct();
    }

}
  • 输出:
使用Mysql数据库连接增加产品
  • 类图如下:

在这里插入图片描述


合成复用原则

  • 实现数据库连接的扩展性
  • DBConnection.java
/**
 * @Description DB连接
 * @date Dec 19, 2021
 * @version 1.0
 */
public abstract class DBConnection {

    /**
     * 获取DB链接
     * @return
     */
    public abstract String getConnection();

}
  • MysqlConnection.java
/**
 * @Description Mysql连接
 * @date Dec 20, 2021
 * @version 1.0
 */
public class MysqlConnection extends DBConnection {
    @Override
    public String getConnection() {
        return "Mysql数据库连接";
    }
}
  • OracleConnection.java
/**
 * @Description Oracle连接
 * @date Dec 20, 2021
 * @version 1.0
 */
public class OracleConnection extends DBConnection {
    @Override
    public String getConnection() {
        return "Oracle数据库连接";
    }
}
  • ProductDao.java
/**
 * @Description 产品DAO
 * @date Dec 19, 2021
 * @version 1.0
 */
 public class ProductDao {

    private DBConnection dbConnection;

    /**
     * setter注入
     * @param dbConnection
     */
    public void setDbConnection(DBConnection dbConnection) {
        this.dbConnection = dbConnection;
    }

    /**
     * 添加产品
     */
    public void addProduct() {
        String conn = dbConnection.getConnection();
        System.out.println("使用" + conn + "增加产品");
    }

}
  • Test.java
/**
 * @Description 合成复用原则测试类
 * @author Coisini
 * @date Dec 19, 2021
 * @version 1.0
 */
public class Test {

    public static void main(String[] args) {
        ProductDao productDao = new ProductDao();
        productDao.setDbConnection(new MysqlConnection());
        productDao.addProduct();

        productDao.setDbConnection(new OracleConnection());
        productDao.addProduct();
    }

}
  • 输出:
使用Mysql数据库连接增加产品
使用Oracle数据库连接增加产品
  • 类图变化如下:

在这里插入图片描述


源码


- End -
- 个人学习笔记 -

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章