学习设计模式之桥接模式

桥接模式
在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?这就要使用桥接模式。而具体使用的方式,则是将抽象部分与他们的实现部分分离,使得它们都可以独立的变化。

什么才是抽象部分与它的实现分离呢,并不是说将抽象类和实现类分离。实现指的是抽象类和它的实现类用来实现自己的对象。

类结构图
桥接模式类结构图
Abstraction
抽象部分
RefinedAbstraction
被提炼的抽象
Implementor
实现部分
ConcreteImplementorA、ConcreteImplementorB
具体实现

从上图来看抽象部分的具体行为交给了实现部分,举个栗子笔记本有很多品牌,笔记本可以安装很多软件,那么可以分为笔记本品牌和笔记本软件抽象类,让不同的品牌和功能分别继承于他们。这样的话要增加新的品牌或新的功能都不用影响到其他类了。笔记本品牌包含软件,但软件不是品牌的一部分,所以它们之间是聚合关系。

在这里插入图片描述
代码示例

public interface NotebookSoft {
    void run();
}

public class NotebookSoftA implements NotebookSoft {
    @Override
    public void run() {
        System.out.println("运行 A 软件!");
    }
}

public class NotebookSoftB implements NotebookSoft {
    @Override
    public void run() {
        System.out.println("运行 B 软件!");
    }
}

public abstract class Notebook {

    private NotebookSoft notebookSoft;

    public void setNotebookSoft(NotebookSoft notebookSoft) {
        this.notebookSoft = notebookSoft;
    }

    public NotebookSoft getNotebookSoft() {
        return notebookSoft;
    }

    public abstract void run();
}

public class NotebookA extends Notebook {
    @Override
    public void run() {
        System.out.println("A 笔记本开始运行!");
        super.getNotebookSoft().run();
    }
}

public class NotebookB extends Notebook {
    @Override
    public void run() {
        System.out.println("B 笔记本开始运行!");
        super.getNotebookSoft().run();
    }
}

客户端示例

public class Client {
    public static void main(String[] args) {
        Notebook notebook = new NotebookA();
        notebook.setNotebookSoft(new NotebookSoftA());
        notebook.run();
        notebook.setNotebookSoft(new NotebookSoftB());
        notebook.run();

        notebook = new NotebookB();
        notebook.setNotebookSoft(new NotebookSoftA());
        notebook.run();
        notebook.setNotebookSoft(new NotebookSoftB());
        notebook.run();
    }
}

运行结果

A 笔记本开始运行!
运行 A 软件!
A 笔记本开始运行!
运行 B 软件!
B 笔记本开始运行!
运行 A 软件!
B 笔记本开始运行!
运行 B 软件!

Process finished with exit code 0

优点

  1. 分离抽象接口及其实现部分。提高了比继承更好的解决方案。
  2. 扩展更加的容易,符合对修改关闭对扩展开放。

缺点
桥接模式的引入会增加系统的理解与复杂度。

猜你喜欢

转载自blog.csdn.net/qq_16830879/article/details/88198188