1.模式动机与定义
模式定义
- 桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。
- 对象结构型模式,又称为柄体(Handle and Body)模式或接囗(Interface)模式
- 用抽象关联取代了传统的多层继承
- 将类之间的静态继承关系转换为动态的对象组合关系
2.模式结构与分析
模式结构
桥接模式包含如下角色
- Abstraction:抽象类:用于定义抽象类的接口,它一般是抽象类而不是接口。其中定义了一个Implementor(实现抽象类)类型的对象并可以维护该对象,它与Implementor之间具有关联关系,可以包含抽象的业务方法,还可以包含具体的业务方法。
- RefinedAbstraction:扩充抽象类:扩充由Abstraction定义的接口,不再是抽象类而是具体类,实现定义中的抽象业务方法。
- Implementor:实现类接口:实现Implementor接口并具体实现它,在不同的concreteImplementor中提供基本操作的不同实现,在程序运行时,其对象将替换其父类对象,提供给客户端具体的业务操作方法。
- Concretelmplementor:具体实现类类:定义实现类的接口
模式分析
理解桥接模式,重点需要理解如何将抽象化(Abstraction)与实现化(Implementation)脱耦使得二者可以独立地变化。
抽象化:抽象化就是忽略一些信息,把不同的实体当作同样的实体对待。在面向对象中,将对象的共同性质抽取出来形成类的过程即为抽象化的过程。
实现化:针对抽象化给出的具体实现,就是实现化,抽象化与实现化是一对互逆的概念,实现化产生的对象比抽象化更具体,是对抽象化事物的进一步具体化的产物。
脱耦:脱耦就是将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联,将两个角色之间的继承关系改为关联关系。桥接模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用关联关系(组合或者聚合关系)而不是继承关系,从而使两者可以相对独立地变化:这就是桥接模式的用意。
//典型的实现类接口代码
public interface Implementor{public void operationImpl();
}//典型的抽象类代码
public abstract class Abstraction{protected Implementor impl;public void setlmpl(Implementor impl){this.impl=impl;}public abstract void operation();
}//典型的扩充抽象类代码
public class RefinedAbstraction extends Abstraction{public void operation(){//代码impl.operationImplO;//代码}
}
3.模式效果与应用
优点
分离抽象接口及其实现部分
可以取代多层继承方案,极大地减少了子类的个数
提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,不需要修改原有系统,符合开闭原则
缺点
会增加系统的理解与设计难度,由于关联关系建立在抽象层,要求开发者开始就要针对抽象层进行设计与编程
正确识别出系统中两个独立变化的维度并不是一件容易的事情
使用情况
- 需要在抽象化和具体化之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系
- 抽象部分和实现部分可以以继承的方式独立扩展而互不影响
- 一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立地进行扩展
- 不希望使用继承或因为多层继承导致系统类的个数急剧增加的系统