桥梁模式:又称柄体模式【GOF95】桥梁模式的用意是"将抽象化 (Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化"。
关键词: 抽象化、实现化、脱耦
脱耦:
所谓耦合就是两个实体之间存在某种强关系,比如说java中的继承。所谓脱耦就是将两个实体之间存在的这种强关系去掉,或者将两者之间的关系改为弱关系。
java类之间的关系分为:继承、实现、依赖、聚合、关联、组合。
强关系:继承、实现
弱关系:依赖<聚合<关联<组合。
依赖是一种非常弱的关系,一种临时、偶然的关系,如:表现为一个类A的一个方法传入一个类B当参数。
聚合是一种has-a的关系,如:一台电脑有一个cpu,这里的电脑和cpu是一种整体与部分的关系,表现为一个类A引用了一个类B作为属性。
关联是一种平等关系,如:我和我的朋友,这里我和我的朋友是平等的,表现为一个类A引用一个类B作为属性,和聚合关系表现一直。
组合是一种比较强的关联关系contains-a:如:我和我的心脏,这里我和我的心脏是整体和部分的关系,但这两者之间的关系式不可以分割的,但我消失心脏就随之消失。代码上的表现和关联关系一致。
桥梁模式的结构:
实现图:
从图中不难看出:
1、Abstracion与RefinedAbstaraction组成的一个抽象化等级结构。
2、Implementor与ConcreteImplementorA、ConcreteImplementorB组成一个实现化等级结构。
图中角色定义:
Abstracion抽象化角色:定义抽象对象,并对Implementor实现化对象进行引用。
RefinedAbstracion抽象化对象的实现:对父类的修改。
Implementor实现化对象:约定实现对象的行为,没有具体的实现。
ConcreteImplementor:实现化对象行为的实现。
抽象化角色就像是一个水杯的手柄,而实现化角色和具体实现化角色就像是水杯的杯身。手柄控制杯身,这就是此模式别名“柄体”的来源。
具体代码:
//抽象化 public abstract class Abstraction{ protected Implementor impl;//聚合体现 public Abstraction(Implementor impl){ this.impl=impl; } public void operation(){ impl.operationImpl();//委派对象调用方法 } } //抽象化对象实现 public class refinedAbstraction extends Abstration{ public refindedAbstraction(Implementor impl){ this.impl=impl; } //其他方法 public void otherOperation(){ } } //实现化 public interface Implementor{ public void operationImpl(); } //实现 public class ConcreteImplementorA implements Implementor{ public void operationImpl(){ } } public class ConcreteImplementorB implements Implementor{ public void operationImpl(){ } }
main(){ RefinedAbstractor r=new RefinedAbstractor (new ConcreateImplementorA()); r.operation(); }
适用场景:
1、一个抽象对象,有各种各样的行为。比如:数据库的链接,采用JDBC连接。可以把JDBC抽象化一个对象,这个对象可以链接不同的数据库(不同的行为实现)。这时可采用桥梁模式。
桥梁模式使用频率不高,在一些框架中都采用IOC(控制反转)中的依赖注入(DI)方式,来减少对象之间的耦合程度。
如果不明白的同学可以看看IOC的原理,其实就是通过反射(类型或者类名),动态生成类。