设计模式之桥梁模式

来源:互联网 发布:淘宝古着能买吗 编辑:程序博客网 时间:2024/05/17 02:43

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 gameIPhone run app contact

这样一来,如果要添加新的手机品牌或者手机应用,只要添加单个品牌类或者应用类即可,想要具体某种品牌某种应用的话,只要两两组合即可。

因为品牌类和抽象类两个类之间是聚合关系,将各自旗下的子类连接了起来,所以叫做Bridge Pattern。也就是所说的将抽象部分与其实现部分相分离,使之可以独立的变化。

原创粉丝点击