设计模式--桥接模式

来源:互联网 发布:淘宝宝贝描述图片宽度 编辑:程序博客网 时间:2024/05/21 20:12

先举个例子:有3种型号的钢笔能够画出粗,中,细三种大小的线,但是现在需要画出各种粗细,每种粗细7种颜色的线。那么总共需要3*7=21支钢笔。如果换成毛笔,3种型号画出三种线,再配备7种颜料,则只需要3+7=10个东西就可以画出21种不同的线来。而且如果需要增加一种型号,钢笔等于需要增加7支才能再画出7种线来,毛笔只需要增加一支就可以了,颜料不需要动。从代码设计的角度来说,钢笔把型号(也就是线条粗细)和颜色耦合到了一起,任何一个因素的改变都需要改变另一个因素。而毛笔将型号和颜色分离开来,让这两个因素能够独立的改变扩展,再把他们随意组合起来就可以画出不同粗细,不同颜色的线。
在代码设计中,如果一个类有两个或多个独立变化的维度,通过桥接模式能够将这两个维度分离开来,使得他们可以独立扩展,相互不影响。它将两个独立变化的维度设计为两个独立的继承结构,并且在抽象层上建立组合关系。
下面看一下桥接模式的结构图:
桥接模式结构图
Abstraction(抽象类)是其中一个变化维度,而且是两个变化维度中变化稍小一点,相对另一个维度来说更稳定,更不容易变化的维度。例如在毛笔的例子中,这个抽象类表示毛笔的型号。它的子类及表示不同型号的毛笔。它定义了一个Implementor类型的对象,并且维护该对象,与implementor之间具有关联关系。

refinedAbstraction(扩展抽象类),它是对于Abstraction抽象类的扩充,通常是具体类而不是抽象类。它能够调用implementor中定义的业务方法。

implementor(实现类接口)定义实现类的接口,这个接口对应另一个变化维度,与abstraction这个维度相互独立。这一般是一个接口,定义一些业务方法,具体的业务交给其实现类来完成。

concreteImplA,concreteImplB(具体实现类),具体实现implementor接口,不同的实现类中实现不用的业务操作。在程序运行时,可以将这些具体实现类注入到abstraction的实现类中。

如果用桥接模式实现上文中的毛笔画线程序。结构图如下:这里写图片描述

桥接模式的优点:
使用对象间的关联关系解耦了类的两个或多个变化维度的绑定关系。使得两个维度可以独立起来,建立起各自的继承体系而相互不干扰。
桥接模式提高了系统的可扩展性,修改一个变化维度,不需要修改另一个维度,符合开闭原则。
应用场景:
1.类存在两个或多个变化因素,且要求这两个因素互相独立。
2.如果类的某一个变化因素被多个对象所共享,可以考虑将这个因素分离出去。
3.我们希望一个类的多个变化因素可以相互组合,动态变化。

下面说一下桥接模式和适配器模式的联合使用。

0 0
原创粉丝点击