桥接模式(Bridge)

一:纲要

  • 桥接模式的定义(目的)
  • 桥接模式的使用场景
  • 桥接模式的实现

 

二:定义(目的)

将抽象和实现解耦,使得两者可以独立变化。

 

三:使用

3.1 桥接模式适用于设计阶段,不同于“装饰模式”、“适配器模式”这些主要用于扩展功能的模式。

3.2 场景

  • 不希望或者不使用继承的场景  如:在可以预见子类之间差异比较大的情况
  • 接口或抽象类不稳定的情况
  • 重用性要求较高的场景

 

四:实现

4.1 如何将抽象和实现解耦? 将实现作为抽象的一个引用, 有点类似于代理, 但是抽象和实现的接口不需要完全一致。

4.2 角色

  • Abstraction(抽象化角色) 定义抽象接口, 保存一个实现化角色的引用
  • RedefinedAbstraction  扩展Abstraction接口
  • Implementor(实现化角色)是一个接口或抽象类, 定义角色必须的行为和属性, 不需要和Abstraction的接口一样,两者是独立的
  • ConcreteImplementor(具体实现角色) 继承Implementor

4.3结构

image

4.4例子(模板)(java)

实现化角色:

public interface Implementor{
    public void doSomething();
   
    public void doAnything();
}

 

具体实现化角色:

public class ConcreteImplementor1 implements Implementor{

    @Override
    public void doSomething() {
        // TODO Auto-generated method stub
       
    }

    @Override
    public void doAnything() {
        // TODO Auto-generated method stub
       
    }
   
}

public class ConcreteImplementor2 implements Implementor{

    @Override
    public void doSomething() {
        // TODO Auto-generated method stub
       
    }

    @Override
    public void doAnything() {
        // TODO Auto-generated method stub
       
    }
   
}

 

抽象化角色:

public abstract class Abstraction{
    private Implementor impl;
   
    public Abstraction(Implementor _impl){
        this.impl = _impl;
    }
   
    public void request(){
        this.impl.doSomething();
    }
   
    public Implementor getImplementor(){
        return this.impl;
    }
}

 

具体抽象化角色:

public class RedefinedAbstraction extends Abstraction{

    public RedefinedAbstraction(Implementor _impl) {
        super(_impl);
        // TODO Auto-generated constructor stub
    }
   
    @Override
    public void request() {
        // TODO Auto-generated method stub
        super.request();
        this.getImplementor().doAnything();
    }
   
}

 

场景:

Implementor implementor = new ConcreteImplementor1();
Abstraction abstraction = new RedefinedAbstraction(implementor);
abstraction.request();

//Implementor 和 Abstraction 在 Abstraction 对象初始化的时候才绑定在一起

 

五:继承的缺点

    强侵入是继承的一个明显缺点。父类拥有某个方法,则子类不可选择的也要有这个方法。

    假设有类A、B、C, C继承于B而B继承于A。 A拥有一个接口someInterface, 则 B 和 C 都会拥有这个接口。现在在没有使用桥接模式的情况下

我们修改中间的类 B 的someInterface接口, 这样 C 也被逼的也跟着 B 的改变而改变。但是如果一开始我们就是把someInterface桥接出去的话,

我们就可以做到只修改 B 而不影响到 C。

posted @ 2016-06-27 13:54  KbDaVinci  阅读(209)  评论(0编辑  收藏  举报