设计模式之桥梁模式

xiaoxiao2021-02-28  62

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。也就是所说的将抽象部分与其实现部分相分离,使之可以独立的变化。

转载请注明原文地址: https://www.6miu.com/read-63653.html

最新回复(0)