一、什么是桥接模式
在桥接模式中将两个独立变化的维度设计为两个独立的继承等级结构,而不是将二者耦合在一起形成多层继承结构。桥接模式在抽象层建立起一个抽象关联,该关联关系类似一条连接两个独立继承结构的桥,故名桥接模式。桥接模式将抽象部分与它的实现部分解耦,使得两者都能够独立变化。
二、桥接模式结构
1.Abstraction(抽象类):用于定义抽象类的接口,通常是抽象类而不是接口,其中定义了一个Implementor(实现类接口)类型的对象并可以维护该对象,它与Implementor之间具有关联关系,它即可以包含抽象业务方法,也可以包含具体业务方法。
2.RefinedAbstraction(扩充抽象类):实现了在Abstraction中声明的抽象业务方法,在RefinedAbstration中可以调用在Implementor中定义的业务方法。
3.Implementor(实现类接口):定义实现类的接口。一般而言,Implementor接口仅提供基本操作,而Abstraction定义的接口可能会做更多复杂操作。
4.ConcreteImplementor(具体实现类):它具体实现了Implementor接口,不同的接口提供了不同的实现。
三、桥接模式实现
对于实现部分维度,其典型代码如下:
public interface Implementor{
public void operationImpl();
}
具体实现类典型代码:
public class ConcreteImplementor implements Implementor{
public void operationImpl(){
//具体业务方法的实现
}
}
“抽象部分”典型代码:
public abstract class Abstraction{
protected Implementor impl; //定义实现类接口对象
public void setImpl(Implementor impl){
this.impl=impl;
}
public abstract void operation(); //声明抽象业务方法
}
典型的RefinedAbstraction类代码如下:
public class RefinedAbstraction extends Abstration{
public void operation(){
//业务代码
impl.operationImpl(); //调用实现类的方法
//业务代码
}
}
对于客户端而言,针对两个维度的抽象类编程,在程序运行时再动态确定两个维度的子类,动态组合对象,将两个独立变化的维度完全解耦,以便能够灵活地扩充任一维度而不对另一维度造成影响。
public class client{
public static void main(String[] args){
Image image;
ImageImp imp;
image=(Image)XMLUtil.getBean("image"); //一个维度
imp=(ImageImp)XMLUtil.getBean("os"); //另一个维度,实现了解耦
image.setImageImp(imp);
image.parseFile("小龙女");
}
}
四、桥接模式适用环境
1.如果一个系统需要在抽象化和具体化之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系,通过桥接模式可以使它们在抽象层建立一个关联关系。
2.一个类存在两个或多个独立变化的维度,且这两个(或多个)维度都需要独立进行扩展。
3.对于那些不希望使用继承或因为多层继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。