说明
桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化,解耦合。
UML
代码
以不同的品牌的电脑安装运行不同类型的软件为例,电脑和软件就是上述的抽象与实现,将电脑和软件分离,二者没有任何继承或实现的关系,通过桥接模式来完成二者的聚合,代码如下。
抽象出来的电脑,可以有不同品牌,将软件作为属性
/**
* @author ctl
* @date 2021/1/20
* 电脑,可以有不同品牌
*/
public abstract class Computer {
protected Software software;
public void setSoftWare(Software softWare) {
this.software = softWare;
}
public abstract void run();
}
A品牌的电脑
/**
* @author ctl
* @date 2021/1/20
* A品牌的电脑
*/
public class ComputerA extends Computer {
@Override
public void run() {
System.out.println("A品牌的电脑开始运行程序...");
this.software.run();
}
}
B品牌的电脑
/**
* @author ctl
* @date 2021/1/20
* B品牌的电脑
*/
public class ComputerB extends Computer {
@Override
public void run() {
System.out.println("B品牌的电脑开始运行程序...");
this.software.run();
}
}
软件顶级接口
/**
* @author ctl
* @date 2021/1/20
* 电脑要安装的软件,可以有不同种类
*/
public interface Software {
void run();
}
编码软件
/**
* @author ctl
* @date 2021/1/20
* 编码软件
*/
public class CodeSoftware implements Software {
@Override
public void run() {
System.out.println("编码软件运行...");
}
}
画图软件
/**
* @author ctl
* @date 2021/1/20
* 画图软件
*/
public class DrawSoftware implements Software {
@Override
public void run() {
System.out.println("画图软件运行...");
}
}
测试类
/**
* @author ctl
* @date 2021/1/20
* Computer与SoftWare间没有任何继承或实现的关系,是通过桥接模式来进行的聚合
* 可以分别扩展Computer的类型和SoftWare的类型,互不影响
* <p>
* 如果不用这种模式,可能会将Computer作为顶级接口或顶级父类,然后各个品牌的Computer继承或实现顶级Computer
* 再将SoftWare作为各个品牌Computer的属性或子类,这样Computer和SoftWare就耦合在了一起,不利于扩展
*/
public class BridgeMain {
public static void main(String[] args) {
Computer computer;
computer = new ComputerA();
computer.setSoftWare(new CodeSoftware());
computer.run();
computer.setSoftWare(new DrawSoftware());
computer.run();
System.out.println("-----------分割线----------");
computer = new ComputerB();
computer.setSoftWare(new DrawSoftware());
computer.run();
computer.setSoftWare(new CodeSoftware());
computer.run();
}
}
结果
如在测试类中的注释所说,Computer与Software没有任何继承或实现的关系,如果Computer的类型和Software可以分别进行扩展互不干扰,并且不会影响原有的代码逻辑。
若不用桥接模式,假设将Computer作为顶级接口或顶级父类,然后每个品牌的电脑作为抽象类实现Computer接口,再把software作为子类,调用时去调用software实现类的方法,这样就不利于扩展了,并且继承关系非常复杂。
总结
文章开头有三个关键词:抽象、实现、解偶。
抽象对应的就是这个demo中的computer。
抽象指的是某个相同类型,存在于多个实体中的共同的概念关系,即不同品牌的电脑都是电脑。。
实现对应的就是software。
实现指的是抽象化给出的具体实现,比如真正run起来的是软件,而不是电脑。
而解耦指的是将两个角色之间的继承关系改为聚合关系,就是将它们之间的强关联改换成为弱关联。因此,桥接模式中的所谓解耦,就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以相对独立地变化。这就是桥接模式的用意。