概念
如果实现系统可能有多个角度,每一种分类都可能有变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合。
**根据合成/聚合服用原则,尽量使用合成/聚合,尽量不要使用类继承。**以手机为例,手机可以按照品牌分,也可以按照存储内存分。如果每种品牌每种内存都建立一个类的话,会急剧增加类的数量。
代码
代码以手机为例,这里的分类角度有品牌----小米、华为,也有存储空间----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();
}
}