桥接模式是一种将类的功能层次和实现层次分离的技术,所谓类的功能层次指的是类要实现什么功能,要定义多少个函数还进行处理,在功能之中我们会用到继承来定义新的方法同时也能使用父类的方法,这样就构成了一个层次“父类-子类-孙类...”,这就是功能层次,与之对应的就是实现层次了,其实也很好理解,如果我们事先确定了完成一件事情的最基本的子功能,那么我们定义这些子功能为接口或者抽象类,然后使用实现类来进行实现,这样一个抽象类,多个实现类,(抽象类——>(实现类1,实现类2,实现类...))这样的结构就是实现层次,可以看到高度一直为2,而功能层次高度为N(N为继承的层次)。
Bridge 中午意译为 桥梁
2、示例
类图:
![image-20200721145525382](https://i-blog.csdnimg.cn/blog_migrate/5b45105e48799bfd6ccd93ee26f08508.png)
定义Printer接口类
package cn.design.structured.bridge;
/**
* @author lin
* @version 1.0
* @date 2020-07-21 14:34
* @Description TODO
*/
public interface Printer {
void open();
void print();
void close();
}
定义PrinterImpl实现类
package cn.design.structured.bridge;
/**
* @author lin
* @version 1.0
* @date 2020-07-21 14:35
* @Description TODO
*/
public class PrinterImpl implements Printer {
String string;
int width;
public PrinterImpl(String string) {
this.string = string;
this.width = string.length();
}
定义Display类
package cn.design.structured.bridge;
/**
* @author lin
* @version 1.0
* @date 2020-07-21 14:39
* @Description TODO
*/
public class Display {
Printer printer;
public Display(Printer printer) {
this.printer = printer;
}
public void display(){
printer.open();
printer.print();
printer.close();
}
}
定义CountDisplay继承类
package cn.design.structured.bridge;
/**
* @author lin
* @version 1.0
* @date 2020-07-21 14:40
* @Description TODO
*/
public class CountDisplay extends Display {
int count;
public CountDisplay(Printer printer, int count) {
super(printer);
this.count = count;
}
public void multiDisplay() {
printer.open();
for (int i = 0; i < count; i++) {
printer.print();
}
printer.close();
}
}
定义BridgeMain测试类
package cn.design.structured.bridge;
/**
* @author lin
* @version 1.0
* @date 2020-07-21 14:42
* @Description TODO
*/
public class BridgeMain {
public static void main(String[] args) {
Display d1 = new Display(new PrinterImpl("Hello World"));
d1.display();
CountDisplay c1 = new CountDisplay(new PrinterImpl("Hello FaGeJiang !"), 3);
c1.display();
c1.multiDisplay();
}
}
运行结果如下:
+-----------+
|Hello World|
+-----------+
+-----------------+
|Hello FaGeJiang !|
+-----------------+
+-----------------+
|Hello FaGeJiang !|
|Hello FaGeJiang !|
|Hello FaGeJiang !|
+-----------------+
3、登场角色分析
类图:
![image-20200721145924263](https://i-blog.csdnimg.cn/blog_migrate/9a25dcbe29012712d02d8ae657320d13.png)
Abstraction(抽象化)
该角色位于“类的功能层次的结构”的最上层。它使用Implementor角色的方法定义了基本的功能。该角色中保存了Implementor角色的实例。在示例程序中,由Display类扮演此角色。
RefinedAbstraction(改善后的抽象化)
在Abstraction角色的基础上增加了新功能的角色。在示例程序中,由CountDisplay类扮演此角色。
Implementor(实现者)
该角色位于“类的实现层次结构”的最上层。它定义了用于实现Abstraction角色的接口(API)的方法。在示例程序中,由DisplayImpl类扮演此角色。
ConcreteImplementor(具体实现者)
该角色负责实现在Implementor角色中定义的接口(API)。在示例程序中,由StringDisplayImpl类扮演此角色。
“类的功能层次结构”和“类的实现层次结构”之间的桥梁就是Abstraction角色中的impl字段。
4、小结
桥梁模式的用意是"将抽象化(Abstraction)与实现化([Implementation]脱耦],使得二者可以独立地变化"。这句话有三个关键词,也就是抽象化、实现化和脱耦。
抽象化
存在于多个实体中的共同的概念性联系,就是抽象化。作为一个过程,抽象化就是忽略一些信息,从而把不同的实体当做同样的实体对待。
实现化
抽象化给出的具体实现,就是实现化。
脱耦
所谓耦合脱耦是指将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联。
这是一个稍偏基础和偏技术的公众号,甚至其中包括一些可能阅读量很低的包含代码的技术文,不知道你是不是喜欢,期待你的关注。
代码分享
微信公众号 点击关于我,加入QQ群,即可获取到代码以及高级进阶视频和电子书!!
![img](https://i-blog.csdnimg.cn/blog_migrate/4542dd2e4bea20254b3a29f791cddb68.jpeg)
如果你觉得文章还不错,就请点击右上角选择发送给朋友或者转发到朋友圈~
● 扫码关注我们
据说看到好文章不推荐的人,服务器容易宕机!