• 定义:尽量使用对象组合/聚合,而不是继承关系达到软件复用的目的。
  • 聚合has-A和组合contanins-A
  • 优点:可以使用系统更加灵活,降低类玉类之间的耦合度,一个类的变化对其他类造成影响相对影响较少。

何时使用合成/聚合、继承

public class DBconnection {
    public String getConnection(){
        return "DB链接";
    }
}

public class ProduxtDao extends  DBconnection {
    public void addProduct(){
        String conn = super.getConnection();
        System.out.println("使用" + conn +"增加产品");
    }
}


public class Test {
    public static void main(String[] args) {
        ProduxtDao productdao = new ProduxtDao();
        productdao.addProduct();
    }
}

java复合类型定义 java合成复用原则_java复合类型定义

如果需要扩展 一个DB的 此时 就要修改 DBconnection 违反了 开闭原则
所以我们把 DBconnection 申明 为 抽象类 getConnection()为 抽象方法。

public abstract  class DBconnection {
//    public String getConnection(){
//        return "DB链接";
//    }
    public abstract String getConnection();
}

//实现了抽象了 DBconnection
// mysql is - a DBconnection
public class MySqlConnection extends  DBconnection {
    //获取mysql数据库
    @Override
    public String getConnection() {
        return "Mysql数据库连接";
    }
}
//实现了抽象了 DBconnection
// pgsql is - a DBconnection
public class PostgreSQLConnection extends  DBconnection {
    //获取pgsql数据库
    @Override
    public String getConnection() {
        return "pgsql数据库使用";
    }
}

public class ProduxtDao{
    public void setDbconnection(DBconnection dbconnection) {
        this.dbconnection = dbconnection;
    }
    //ProduxtDao has-a dbconnection
    private DBconnection dbconnection;
    public void addProduct(){
        String conn = dbconnection.getConnection();
        System.out.println("使用" + conn +"增加产品");
    }
}

    public static void main(String[] args) {
    	//声明一个产品Dao
        ProduxtDao productdao = new ProduxtDao();
        //将mysql数据库生成放入 产品Dao
        productdao.setDbconnection(new MySqlConnection());
        //增加产品 
        productdao.addProduct();
    }

java复合类型定义 java合成复用原则_java复合类型定义_02

聚合has-A、组合contains-A 继承 is -A
通过抽象类 继承 的方法 定义了所有的数据库 都是 DBconnection 都可以获取 数据库 在Dao 层 引入了数据库 因为 增加产品方法 和 数据库之间属于组合 has -a 关系 。