这是我参与8月更文挑战的第25天,活动详情查看:8月更文挑战
Bridge,桥梁,遍布世界各地,一定是两个地点之间交通极其不便才会兴师动众去搭建一座桥。有跨越河流的,跨越山谷的,穿过山洞的,都是为了可以更快的达到目的地。设计模式中的桥接模式亦是如此。不过这里所搭建的桥是两个抽象的概念:
- 类的功能层次
- 类的实现层次
乍一看确实很抽象,以至于我们不甚理解。首先解释一下,功能的层次在于继承,可以通过继承不断扩充父类的功能,这里并不是直接在父类增加方法,虽然这么做也可以,但并不利于扩展。实现的层级在于抽象方法的多实现。简而言之,我们需要把抽象的功能和具体的实现分来,然后就可以在这两个方面分别迭代,而且互不影响。就是增加功能,所有的实现都能用;增加实现可以直接增加,功能的方法不用修改。
有什么好处和使用场景呢?这是每次思考设计模式的绕不开的问题,不然就失去了意义。首先好处,非常利于扩展,增加功能定义还是增加实现几乎是独立的;然后使用场景,比如服务端的接口需要针对不同的端(Android,IOS,Desktop等)有不同的定制化需求,你可能有很多种方式来实现三端的区分,但通过桥接模式来实现是逻辑清晰,扩展性强的一种方式。下面来看一个例子,看完就会比较清晰Bridge到底是在干嘛了。
其中Display是基础的功能定义类,持有DisplayImpl,但说它是实现,其实是一个抽象类,里面只定义了抽象方法,供需要的业务来实现。CounterDisplay则是在Display的基础上扩充的功能,可以显示多行的数据,原来则只能显示一行。StringDisplayImpl是具体的显示实现。使用时是什么样的呢?
public static void main(String[] args){
Display d1 = new Display(new StringDisplayImpl("hi"));
Display d2 = new CounterDisplay(new StringDisplayImpl("hi"));
CounterDisplay d1 = new CounterDisplay(new StringDisplayImpl("hi"));
d1.display();
d2.display();
d3.multiDisplay();
}
即使我新增一个新的Display的功能叫LessDisplay,即显示较少的内容的功能,对于所有的实现类都是可用的,实现类内部则完全不用改动。同理,新增一个实现类HtmlDisplayImpl,只用关注自己的具体实现,对于Display的所有子类都是可用的。