如果按照这种继承方式,无论添加一种软件或手机品牌,都需要增加不止一个类,维护极其复杂.
采用合成/聚合的的方式则只需增加一个类.
面向对象设计中一条很重要的原则,合成/聚合复用原则.即优先使用对象合成/聚合,而不是类继承.
在使用继承时,一定要在是”is-a”的关系时才考虑使用,而不是任何时候都去使用.
让抽象部分和实现部分相分离(如手机,既可以按品牌分类,又可以按软件分).
实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合.
1 2 3 4 5 6 7 8 9
| package bridge;
public abstract class PhoneSoft { public abstract void run(); }
|
1 2 3 4 5 6 7 8 9 10 11 12
| package bridge;
public class Game extends PhoneSoft { @Override public void run() { System.out.println("game run"); } }
|
1 2 3 4 5 6 7 8 9 10 11 12
| package bridge;
public class AddressList extends PhoneSoft { @Override public void run() { System.out.println("address list run"); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| package bridge;
public abstract class PhoneBrand { protected PhoneSoft phoneSoft;
public PhoneBrand(PhoneSoft phoneSoft) { this.phoneSoft = phoneSoft; }
public abstract void run(); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| package bridge;
public class PhoneBrandA extends PhoneBrand { public PhoneBrandA(PhoneSoft phoneSoft) { super(phoneSoft); }
@Override public void run() { phoneSoft.run(); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| package bridge;
public class Main { public static void main(String[] args) { PhoneBrand apple = new PhoneBrandA(new Game()); apple.run();
apple = new PhoneBrandA(new AddressList()); apple.run(); } }
|