博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
图解设计模式-Bridge模式
阅读量:6247 次
发布时间:2019-06-22

本文共 2842 字,大约阅读时间需要 9 分钟。

Bridge桥连接模式的作用是将两样东西链接起来,它们分别是
类的功能层次结构和类的实现层次结构。
 
类的功能层次结构
当有一个Something类,要增加它的功能时,可以创建SomethingGood类同时继承Something类,这样就构成了一个小的类的层次结构。
父类具有基础的功能
在子类中增加新的功能
以上就称为类的功能层次结构。注意类的功能层次结构不应该太深。
 
类的实现层次结构
抽象类声明了一些抽象方法,定了了API接口,然后子类负责实现这些抽象方法。父类的任务是通过抽象方法的方式定义接口,而子类的任务是实现抽象方法。这里其实存在层次结构。例如子类ConcreteClass实现了父类AbstractClass类的抽象方法,它们之间就构成了一个小的层次结构。
父类通过声明抽象方法来定义接口API
子类通过实现具体方法来实现接口API
这种层次结构称为“类的实现层次结构”。
 
当我们编写子类时,我们要确认是要增加新功能还是增加实现。当类的层次结构只有一层时,功能层次结构与实现层次结构是混合在一起的,这样很容易使类的层次结构变得复杂,也难理解类的层次结构。
因此我们需要将类的功能层次结构和类的实现层次结构分开。再使用Bridge模式将两种层次结构关联起来。
 
角色:
Abstraction抽象化:该角色位于 “类的功能层次结构”的最上层。它使用Implementor角色的方法定义了基本的功能。该角色中保存了Implementor角色的实例。
RefinedAbstraction改善后的抽象化:在Abstraction角色基础上增加了新的功能。
Implementor实现者:该角色位于“类的实现层次结构”的最上层,它定义用于实现Abstraction角色的接口API。
ConcreteImplementor具体实现者:该角色实现了Implementor角色中定义的接口API。
 
重点说明:
类的功能层次结构是通过继承来体现的,子类继承父类后可以增加新的功能。
类的实现层次结构是通过抽象类和实现类来体现的,实现了继承了抽象类并且实现了抽象类中的抽象方法。
继承是强关系,委托是弱关系。
 
Bridge模式通过委托方式把“类的实现层次结构”委托给“类的功能层次结构”,在代码中体现为:Display父类通过委托方式调用DisplayImpl抽象类。
代码:
public abstract class DisplayImpl {    public abstract void rawOpen();    public abstract void rawPrint();    public abstract void rawClose();}
public class StringDisplayImpl extends DisplayImpl {    private int width;    private String string;    public StringDisplayImpl(String string) {        this.string = string;        this.width = string.length();    }    @Override    public void rawOpen() {        pringLine();    }    @Override    public void rawPrint() {        System.out.println("|" + string + "|");    }    @Override    public void rawClose() {        pringLine();    }    private void pringLine() {        System.out.print("+");        for(int i=0;i
public class Display {    private DisplayImpl impl;    public Display(DisplayImpl impl) {        this.impl = impl;    }    public void open() {        impl.rawOpen();    }    public void print() {        impl.rawPrint();    }    public void close() {        impl.rawClose();    }    public final void display() {        open();        print();        close();    }}
public class CountDisplay extends Display {    public CountDisplay(DisplayImpl impl) {        super(impl);    }    public  void multiDisplay(int times) {        open();        for(int i=0;i
public class Main {    public static void main(String[] args) {        Display display1 = new CountDisplay(new StringDisplayImpl("display1"));        Display display2 = new CountDisplay(new StringDisplayImpl("display2"));        CountDisplay display3 = new CountDisplay(new StringDisplayImpl("display2"));        display1.display();        display2.display();        display3.display();        display3.multiDisplay(3);    }}

结果:

+--------+
|display1|
+--------+
+--------+
|display2|
+--------+
+--------+
|display2|
+--------+
+--------+
|display2|
|display2|
|display2|
+--------+

转载于:https://www.cnblogs.com/use-D/p/9601524.html

你可能感兴趣的文章
LeetCode 347. Top K Frequent Elements
查看>>
二叉树遍历
查看>>
JAVA 并发
查看>>
Markdown引用微博图床被防盗链不加载响应403完美解决
查看>>
0302思考并回答一些问题
查看>>
Sphinx的介绍和原理探索
查看>>
php中mysql数据库操作类 -李盛鹏 -博客园
查看>>
coreseek增量索引
查看>>
ubuntu更新源(2018最新)
查看>>
python使用小结——iloc与loc的使用
查看>>
linux crontab定时任务运行shell脚本(shell执行sql文件)
查看>>
Python用Pillow(PIL)进行简单的图像操作
查看>>
[51Nod 1584] 加权约数和
查看>>
微信小程序的同步操作
查看>>
Lua中的操作系统库
查看>>
环境变量path的值大于1024的解决办法
查看>>
webpack 通用环境快速搭建
查看>>
js获取url参数值
查看>>
Django 文件下载功能
查看>>
浅谈前端性能优化(PC版)
查看>>