6.0 桥接模式

简介

桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。其构成如下:

  • 抽象化角色(Abstraction):抽象化给出的定义,并保存一个对实现化对象的引用。
  • 修正抽象化角色(RefineAbstraction):拓展抽象化角色,改变和修正父类对抽象化的定义。
  • 实现化角色(Implementor):这个角色给出实现化角色的接口,但是不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。
  • 具体实现化角色(ConcreteImplementor):这个角色给出实现化角色接口的具体实现
个人理解:桥接的核心是 抽象化角色(Abstraction),他引用 实现化角色(Implementor),使得二者子类都可以通过抽象化交流,但是又不受子类具体变化影响。例如,我有两部手机,两部电脑,我想把两部手机里的数据通过数据线传到电脑里,请看代码

类图

代码

/**  
 * 数据线
 * 抽象化角色(Abstraction):抽象化给出的定义,并保存一个对实现化对象的引用
 * @author: 张彬
 * @date: 2018年5月16日 上午11:38:47
 * @version: V1.0
 * @review: 张彬/2018年5月16日 上午11:38:47
 */
public abstract class DataWire {
    protected Computer computer;
    public DataWire(Computer computer){
        this.computer = computer;
    }
    public abstract void sendData();
}
/**  
 * 手机
 * 修正抽象化角色(RefineAbstraction):拓展抽象化角色,改变和修正父类对抽象化的定义。
 * @author: 张彬
 * @date: 2018年5月16日 上午11:44:19
 * @version: V1.0
 * @review: 张彬/2018年5月16日 上午11:44:19
 */
public class HuaWei extends DataWire{

    public HuaWei(Computer computer) {
        super(computer);
    }

    @Override
    public void sendData() {
        System.out.println("hw手机发送数据");
        computer.receiveData();
    }

}
/**  
 * 手机
 * 修正抽象化角色(RefineAbstraction):拓展抽象化角色,改变和修正父类对抽象化的定义。
 * @author: 张彬
 * @date: 2018年5月16日 上午11:44:19
 * @version: V1.0
 * @review: 张彬/2018年5月16日 上午11:44:19
 */
public class XiaoMi extends DataWire{

    public XiaoMi(Computer computer) {
        super(computer);
    }

    @Override
    public void sendData() {
        System.out.println("xm手机发送数据");
        computer.receiveData();
    }

}
/**  
 * 电脑
 * 实现化角色(Implementor)
 * 这个角色给出实现化角色的接口,但是不给出具体的实现。
 * 必须指出的是,这个接口不一定和抽象化角色的定义相同,实际上,这两个接口可以非常不一样。
 * 实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。
 * @author: 张彬
 * @date: 2018年5月16日 上午11:33:48
 * @version: V1.0
 * @review: 张彬/2018年5月16日 上午11:33:48
 */
public interface Computer {
    public void receiveData();
}
/**  
 * 具体实现化角色(ConcreteImplementor):这个角色给出实现化角色接口的具体实现。
 * @author: 张彬
 * @date: 2018年5月16日 上午11:46:14
 * @version: V1.0
 * @review: 张彬/2018年5月16日 上午11:46:14
 */
public class Mac implements Computer{

    @Override
    public void receiveData() {
        System.out.println("mac接受数据");
    }

}
/**  
 * 具体实现化角色(ConcreteImplementor):这个角色给出实现化角色接口的具体实现。
 * @author: 张彬
 * @date: 2018年5月16日 上午11:46:14
 * @version: V1.0
 * @review: 张彬/2018年5月16日 上午11:46:14
 */
public class Windows implements Computer{

    @Override
    public void receiveData() {
        System.out.println("windows接受数据");
    }

}
/**  
 * 客户端
 * @author: 张彬
 * @date: 2018年5月16日 上午11:49:11
 * @version: V1.0
 * @review: 张彬/2018年5月16日 上午11:49:11
 */
public class Client {
    public static void main(String[] args) {
        DataWire hw = new HuaWei(new Mac());
        hw.sendData();
        
        DataWire xm = new XiaoMi(new Windows());
        xm.sendData();
    }
}

输出结果:

hw手机发送数据
mac接受数据
xm手机发送数据
windows接受数据

总结

优点:

1、抽象和实现的分离。

2、优秀的扩展能力。

3、实现细节对客户透明。

缺点:

桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。


















猜你喜欢

转载自blog.csdn.net/u011260970/article/details/80336454
今日推荐