桥接模式 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?这就要使用桥接模式。而具体使用的方式,则是将抽象部分与他们的实现部分分离,使得它们都可以独立的变化。
什么才是抽象部分与它的实现分离呢,并不是说将抽象类和实现类分离。实现指的是抽象类和它的实现类用来实现自己的对象。
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 软件!
优点
分离抽象接口及其实现部分。提高了比继承更好的解决方案。
扩展更加的容易,符合对修改关闭对扩展开放。
缺点
桥接模式的引入会增加系统的理解与复杂度。
|