桥梁模式
我们以电脑分类为例进行展开,电脑分为台式机,笔记本,平板等,每种类型又分好多个品牌,如下图所示

现在有如下两个需求:
- 我们要增加一个品牌三星
- 我们要增加一个分类智能手机
需求1的解决方案:我们在台式机,笔记本,平板电脑分类下都添加相应的子类,三星台式机,三星笔记本...
需求2的解决方案:我们在电脑下面添加子类智能手机,然后这个子类下添加各个品牌分类
发现问题:类的个数急速膨胀,管理成本很高,我们意识到用继承来实现是不行的,因为违反了单一职责原则,一个类联想台式机,却有两个引起这个类变化的原因,类型和品牌
类型维度有自己的一套继承结构,品牌维度也有自己的一套继承结构,然后中间有座桥(Bridge)把这两个类关联起来.这样在添加类型时只需在类型维度做修改就好了, 不会影响到品牌维度;当在品牌维度搞活动时,类型维度也不受影响.桥一端的变化不会引起另一端的变化,这就是桥接模式:
我们对上面类型进行修改

下面是实现过程
品牌维度
public abstract class Brand {
//品牌
protected abstract String brand();
}
public class Lenovo extends Brand {
@Override
protected String brand() {
return "联想";
}
}
public class Dell extends Brand {
@Override
protected String brand() {
return "戴尔";
}
}
类型维度
通过构造函数进行桥梁关联
public abstract class Computer {
//这里就相当于是“桥梁”
private Brand brand;
public Computer(Brand brand) {
this.brand = brand;
}
protected abstract String type();
public void sale() {
System.out.println("我们卖的是"+brand.brand() + this.type() +"电脑");
}
}
public class Desktop extends Computer {
public Desktop(Brand brand) {
super(brand);
}
@Override
protected String type() {
return "台式机";
}
}
public class Laptop extends Computer {
public Laptop(Brand brand) {
super(brand);
}
@Override
protected String type() {
return "笔记本";
}
}
客户端
public class Client {
public static void main(String[] args) {
Desktop desktop = new Desktop(new Dell());
desktop.sale();
}
}
此时,如果我们要添加一个智能手机分类可以这样做
public class Smartphone extends Computer {
public Smartphone(Brand brand) {
super(brand);
}
@Override
protected String type() {
return "智能手机";
}
}
客户端代码
public class Client {
public static void main(String[] args) {
Smartphone smartphone = new Smartphone(new Lenovo());
smartphone.sale();
}
}
小结
- 桥接模式可以取代多层继承的方案,多层继承违背了
单一职责原则,复用性较差,类的个数过多,桥接模式可以极大的减少子类的个数,从而降低管理和维护的成本。 - 桥接模式极大的提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有的系统,符合
开放封闭原则。

浙公网安备 33010602011771号