前言
在我们的日常开发中,比如电商项目的商品分类,以电脑为例,电脑可分为台式机、笔记本、平板电脑,而上述几种不同类型的电脑又可以分为好多种品牌,如联想、戴尔、华硕等等。那我们如何来设计这种分类结构呢?有同学说可能想到用多重继承不就解决了(联想笔记本>笔记本>电脑),这种方式是可以解决,但带来的问题就是会产生很多子类,扩展性很差。那如何优雅的来处理这种问题呢,使用桥接模式就能很好地解决这种问题。
什么是桥接模式
桥接模式(
Bridge Pattern
)属于结构型设计模式,用来处理多层继承结构,处理多维度变化的场景,将各个维度设计成独立的继承结构,使各个维度可以独立的扩展在抽象层建立关联。
案例
下面将使用桥接模式来定义电脑的分类
定义一个电脑品牌接口
public interface ComputerBrand {
String getName();
}
分别定义联想、戴尔、华硕等三个类来实现电脑品牌接口
public class Lenovo implements ComputerBrand {
@Override
public String getName() {
return "lenovo";
}
}
public class Dell implements ComputerBrand {
@Override
public String getName() {
return "dell";
}
}
public class Asus implements ComputerBrand {
@Override
public String getName() {
return "asus";
}
}
定义一个电脑抽象类,有一个电脑品牌属性,使用构造方法传入电脑品牌,设置电脑品牌,还有一个抽象方法operation
,需子类去实现
public abstract class Computer {
protected ComputerBrand brand;
public Computer(ComputerBrand brand) {
this.brand = brand;
}
public abstract void operation();
}
分别定义台式机、笔记本、平板电脑等三个类并继承电脑抽象类,重写operation
方法
public class Desktop extends Computer {
public Desktop(ComputerBrand brand) {
super(brand);
}
@Override
public void operation() {
System.out.println(brand.getName() + " desktop computer");
}
}
public class Laptop extends Computer {
public Laptop(ComputerBrand brand) {
super(brand);
}
@Override
public void operation() {
System.out.println(brand.getName() + " laptop computer");
}
}
public class Pad extends Computer {
public Pad(ComputerBrand brand) {
super(brand);
}
@Override
public void operation() {
System.out.println(brand.getName() + " pad computer");
}
}
下面我们来测试
public class Test {
public static void main(String[] args) {
Computer computer = new Desktop(new Lenovo());
computer.operation();
Computer computer2 = new Desktop(new Dell());
computer2.operation();
}
}
输出结果
lenovo desktop computer
dell desktop computer
当需要获取不同品牌的电脑时,只需要传入不同的电脑品牌即可
总结
优点
- 桥接模式分离了抽象部分和实现部分,极大的提高了系统的灵活性,让抽象部分和实现部分独立开来,分别定义接口,这有助于系统进行分层设计,从而产生更好的结构化系统。对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了;
- 桥接模式极大的提高了系统可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有的代码,符合开闭原则;
缺点
- 桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程;
- 桥接模式要求正确识别出系统中多维度的变化,在使用范围上有一定的局限性;
使用场景
- 如果一个系统需要在构建的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间使用继承关联,则可以使用桥接模式将它们在抽象层建立一个关联关系;
- 对于那些因为多层次继承导致产生很多子类的系统,可使用桥接模式;
- 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展的时候;
参考:
https://www.runoob.com/design-pattern/bridge-pattern.html
http://c.biancheng.net/view/1364.html