本文笔记来自于:狂神的设计模式
桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构模型,又称为柄体(Handle and Body)模式或接口(interface)模式。
一、使用场景
我们观察以下结构,如果我们用java的类的继承关系去表示如下这张图的话,会发现修改起来非常麻烦。比如:
-
新增一个品牌,需要在
台式电脑
,笔记本电脑
,平板电脑
三个类下再写三个子类 -
新增一种电脑(人体电脑),就需要在这种电脑下再增加三个品牌
我们再观察叶子节点的类:
联想台式
,戴尔台式
,可以发现每个类负责了两种职能:品牌和电脑类型,违反了单一职责原则
所以我们引入了桥接模式
,我们发现最后的类是由类型和品牌组装而来,我们下次再增加品牌或者类型,只需要坐标节点即可:
二、实现方法
我们需要抽象出 品牌类 和 类型类
//我们首先写一个品牌的接口,里面有一个info方法,输出品牌信息
//品牌
public interface Brand{
void info();
}
接下来我们写两个品牌实现这个接口:
//联想品牌
public class Lenovo implements Brand{
@Override
public void info() {
System.out.print("联想电脑");
}
}
//苹果品牌
public class Apple implements Brand{
@Override
public void info() {
System.out.print("苹果电脑");
}
}
我们之后写一个关于类型的抽象类(这里注意,我们需要与品牌关联,所以我们使用组合的方式,将品牌注入到我们的类型中):
//抽象的电脑类型类
public abstract class Computer {
//出厂的时候自带了品牌 (桥)
protected Brand brand;
//组装
public Computer(Brand brand){
this.brand = brand;
}
public void info(){
//自带品牌
brand.info();
}
}
最后我们编写类型的具体类,每个类都有类型:
class Desktop extends Computer{
public Desktop(Brand brand){
super(brand);
}
@Override
public void info(){
//自带品牌
super.info();
System.out.println("台式机");
}
}
class Laptop extends Computer{
public Laptop(Brand brand){
super(brand);
}
@Override
public void info(){
//自带品牌
super.info();
System.out.println("笔记本");
}
}
类图如下:
三、优势与劣势
好处分析:
桥接模式偶尔类似于多继承方案,但是多继承方案违背了类的单一职责原则, 复用性比较
差,类的个数也非常多,桥接模式是比多继承方案更好的解决方法。极大的减少了子类个数,从而降低管理和维护的成本桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。符合开闭原则,就像一座桥, 可以把两个变化的维度连接起来!
劣势分析:
- 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
- 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。
四、经典案例
-
java 平台通过虚拟机实现平台无关性
-
jdbc 驱动程序