Bridge Pattern:将类的抽象部分与实现部分分离,使它们可以独立地变化。
当一个类的分类可以有多种方式的时候,比如说手机里的应用,可以先按照手机品牌区分,然后再按照应用种类区分;也可以先按照应用种类来区分,然后再按照手机品牌区分。而且品牌和应用种类都可以随意添加。如果直接使用继承来实现,每增加一种品牌,就要多继承出已有应用种类数量的新品牌类,这显然是十分不科学的。
根据合成/聚合复用原则,应该尽量使用合成/聚合方式去组织类。因此可以考虑抽象出手机品牌类和手机应用类,手机品牌类依赖于手机应用类。
手机品牌类及其子类:(与App类的关系是aggregation关系)
public abstract class Phone {
protected App app;
public void setApp(App app) {
this.app = app;
}
public void run() {
System.out.print(getClass().getSimpleName() + " ");
app.run();
}
}
class MiPhone extends Phone {
}
class IPhone extends Phone {
}
应用类及其子类:
public abstract class App {
public abstract void run();
}
class Game extends App {
@Override
public void run() {
System.out.println("run app game");
}
}
class Contact extends App {
@Override
public void run() {
System.out.println("run app contact");
}
}
测试类:
public class Main {
public static void main(String[] args) {
final MiPhone miPhone = new MiPhone();
miPhone.setApp(new Game());
miPhone.run();
final IPhone iPhone = new IPhone();
iPhone.setApp(new Contact());
iPhone.run();
}
}
输出:
MiPhone run app game
IPhone run app contact
这样一来,如果要添加新的手机品牌或者手机应用,只要添加单个品牌类或者应用类即可,想要具体某种品牌某种应用的话,只要两两组合即可。
因为品牌类和抽象类两个类之间是聚合关系,将各自旗下的子类连接了起来,所以叫做Bridge Pattern。也就是所说的将抽象部分与其实现部分相分离,使之可以独立的变化。