概念
如果實現系統可能有多個角度,每一種分類都可能有變化,那麼就把這種多角度分離出來讓它們獨立變化,減少它們之間的耦合。
**根據合成/聚合服用原則,儘量使用合成/聚合,儘量不要使用類繼承。**以手機爲例,手機可以按照品牌分,也可以按照存儲內存分。如果每種品牌每種內存都建立一個類的話,會急劇增加類的數量。
代碼
代碼以手機爲例,這裏的分類角度有品牌----小米、華爲,也有存儲空間----6G和8G。這裏根據品牌建立子類,然後將存儲空間作爲手機的屬性。
抽象手機類
public abstract class Phone {
protected Memory memory;
public void setMemory(Memory memory) {
this.memory = memory;
}
public abstract void buyPhone();
}
手機子類一
public class HuaWei extends Phone {
@Override
public void buyPhone() {
System.out.println("購買了華爲手機,"+this.memory.addMemory());
}
}
手機子類二
public class XiaoMi extends Phone {
@Override
public void buyPhone() {
System.out.println("購買了小米手機,"+this.memory.addMemory());
}
}
存儲空間
public interface Memory {
String addMemory();
}
存儲空間具體類
public class Memory6G implements Memory {
@Override
public String addMemory() {
return "添加6G內存";
}
}
存儲空間具體類二
public class Memory8G implements Memory {
@Override
public String addMemory() {
return "添加8G內存";
}
}
客戶端
public class Client {
public static void main(String[] args) {
Phone huaWei = new HuaWei();
huaWei.setMemory(new Memory6G());
huaWei.buyPhone();
huaWei.setMemory(new Memory8G());
huaWei.buyPhone();
Phone xiaoMi = new XiaoMi();
xiaoMi.setMemory(new Memory6G());
xiaoMi.buyPhone();
xiaoMi.setMemory(new Memory8G());
xiaoMi.buyPhone();
}
}