桥接模式【bridge】
-
什么是桥接模式
将抽象部分于它的实现部分分离,使它们都可以独立地变化,这个摘自<设计模式>的解释,一般很难去理解,稍后我会以代码加文字的形式给大家解释清楚。 -
什么场景会用到桥接模式
现在给大家一个场景,比如现在要做这样一个功能,需求上描述,分别开发多个软件应用,同时需要适应不同的系统,再详细一点,比如,现在开发了一款购物app和阅读app,需要兼容安卓和苹果系统,这时候大家需要怎么进行设计。
大部分新手程序员在接触到这个的时候可能第一时间想到的是继承,通过继承的方式去重写父类的方法,类图如下:
就是父类有抽象方法,具体怎么实现由子类去实现
就是父类是mobile,然后包含运行game和运行read的方法,由每个子类去实现,这样就有了四种不同的实现,这么设计的缺点在哪里呢,第一就是每个app在安卓和苹果系统里面都需要一个子类,比如增加了一个英语学习app,就要分别去两个系统里面添加对应的子类,第二,如果需求改变,比如,需要增加华为鸿蒙系统的兼容,那么这个改变无疑是巨大的,并且如果系统里面多100个要兼容的app,那么就要去增加100个鸿蒙下面的子类,分别不同的实现。
这个时候桥接模式就可以好好利用起来了, 回顾一下桥接模式的概念。由于实现的方式有多种,桥接模式的核心意图就是把这些实现独立出来,让他们各自的变化。这就使得每种实现的变化不会影响其他实现,从而达到应对变化的目的。让我们把设计图修改一下,以达到这个目的
代码如下:
先定义一个Software接口:
public interface Software {
void operate();
}
再写它的两个子类
public class Game implements Software {
@Override
public void operate() {
System.out.println("init game");
}
}
public class Read implements Software {
@Override
public void operate() {
System.out.println("init read");
}
}
接着开始添加一个抽象类Mobile
public abstract class Mobile {
private Software software;
public Software getSoftware() {
return software;
}
public void setSoftware(Software software) {
this.software = software;
}
public abstract void run();
}
然后是它的两个子类实现
public class IOS extends Mobile {
@Override
public void run() {
System.out.println("IOS init..");
getSoftware().operate();
}
}
public class Android extends Mobile {
@Override
public void run() {
System.out.println("Android init..");
getSoftware().operate();
}
}
从以上结构不难看出,若以后不管是添加新的操作系统还是添加新的app都不会相互影响,这就是松耦合
public static void main(String[] args) {
Mobile mobile = new Android();
mobile.setSoftware(new Game());
mobile.run();
mobile.setSoftware(new Read());
mobile.run();
}
现在回想起来,桥接模式这个概念是不是逐渐清晰了,说的通俗易懂一点就是,在我们现实场景中,系统可能按多种维度进行分类,每一种分类都可能发生变化,那么就把这种多角度分类分离出来让他们不相互依赖,减少它们之间的耦合。重点是理解如何将抽象化与现实化的脱耦的。
相关参考:
<大话设计模式>,<设计模式,可复用面向对象软件的基础>
源码在此