A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 大蓝鲸Java 中级黑马   /  2019-3-8 12:09  /  781 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

桥接模式

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


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

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

[AppleScript] 纯文本查看 复制代码
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();

    }

}


客户端示例

[AppleScript] 纯文本查看 复制代码
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();

    }

}


运行结果

[AppleScript] 纯文本查看 复制代码
A 笔记本开始运行!

运行 A 软件!

A 笔记本开始运行!

运行 B 软件!

B 笔记本开始运行!

运行 A 软件!

B 笔记本开始运行!

运行 B 软件!

优点

分离抽象接口及其实现部分。提高了比继承更好的解决方案。

扩展更加的容易,符合对修改关闭对扩展开放。
缺点
桥接模式的引入会增加系统的理解与复杂度。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马