设计模式之桥接模式

定义(百度百科):
      将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。

UML类图:

具体的代码:

public class Client {
    @Test
    public void testBridge() {
        Implementor impl = new ConcreteImplementor();
        Abstraction refinedAbstraction = new RefinedAbstraction();
        refinedAbstraction.setImpl(impl);
        refinedAbstraction.operation();
    }
}

public abstract class Abstraction {
    protected Implementor impl;

    public void setImpl(Implementor impl) {
        this.impl=impl;
    }

    public abstract void operation();
}

public class RefinedAbstraction extends Abstraction {

    @Override
    public void operation() {
        impl.operation();
    }
}

public interface Implementor {
    void operation();
}

public class ConcreteImplementor implements Implementor {

    @Override
    public void operation() {
        System.out.println("实际应用");
    }
}

模块说明:

Abstraction:定义抽象类的接口。
                   维护一个指向Implementor类型对象的引用。
RefinedAbstraction:
                  扩充由Abstraction定义的接口。
Implementor:
                  定义实现类的接口,该接口不一定要与Abstraction的接口完全一致,事实上这两个
                  接口可以完全不同。一般来讲, Implementor接口仅提供基本操作,而Abstraction则
                  定义了基于这些基本操作的较高层次的操作。
ConcreteImplementor:
                  实现Implementor接口并定义它的具体实现。

具体例子:
       网络上有个例子我觉得很不错,分享到这里,画画可以选择蜡笔和毛笔,如果每种笔分为大中小三个型号,并且有12种颜色
那达到同样的需求,蜡笔的话就是12颜色*3种型号,36支笔,毛笔需要12个染色盒和3支不同型号的毛笔,共15只笔,
如果哪天需要新增一种型号的笔,超大号,那蜡笔需要新增12支,毛笔只需要新增1支。
多维度变化,这样的例子桥接模式就很合适了。

应用场景:
引用《研磨设计模式》这本书的一张图如下

优缺点:
优点:
分离抽象和实现部分(面向抽象编程)
更有效减少类的个数,更好的扩展性(就像上面的例子,新增一种型号的笔就可以了)

缺点:
桥接模式,会增加系统设计的难度,并且对抽象要求很高。
桥接模式要求正确识别出两个独立变化的维度,因此其使用范围具有一定的局限性,如何正确识别两个独立维度也是不易的

总结:桥接的本质就是,区分维度分离抽象和实现

原文地址:https://www.cnblogs.com/daily-note/p/7151320.html