桥接模式

如果按照这种继承方式,无论添加一种软件或手机品牌,都需要增加不止一个类,维护极其复杂.

采用合成/聚合的的方式则只需增加一个类.

面向对象设计中一条很重要的原则,合成/聚合复用原则.即优先使用对象合成/聚合,而不是类继承.

在使用继承时,一定要在是”is-a”的关系时才考虑使用,而不是任何时候都去使用.

让抽象部分和实现部分相分离(如手机,既可以按品牌分类,又可以按软件分).
实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合.

1
2
3
4
5
6
7
8
9
package bridge;

/**
* Created by hero on 17-2-20.
*/
public abstract class PhoneSoft {
public abstract void run();
}

1
2
3
4
5
6
7
8
9
10
11
12
package bridge;

/**
* Created by hero on 17-2-20.
*/
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;

/**
* Created by hero on 17-2-20.
*/
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;

/**
* Created by hero on 17-2-20.
*/
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;

/**
* Created by hero on 17-2-20.
*/
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;

/**
* Created by hero on 17-2-20.
*/
public class Main {
public static void main(String[] args) {
PhoneBrand apple = new PhoneBrandA(new Game());
apple.run();

apple = new PhoneBrandA(new AddressList());
apple.run();
}
}