- 定义:尽量使用对象组合/聚合,而不是继承关系达到软件复用的目的。
- 聚合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();
}
}
如果需要扩展 一个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();
}
聚合has-A、组合contains-A 继承 is -A
通过抽象类 继承 的方法 定义了所有的数据库 都是 DBconnection 都可以获取 数据库 在Dao 层 引入了数据库 因为 增加产品方法 和 数据库之间属于组合 has -a 关系 。