一 案列
假如有一个汽车类,然后有三个品牌分别是宝马、奥迪、奔驰,而每一个品牌又有三种车分别是跑车、轿车、suv;同时他们的关系都是通过继承来实现的,此时可以看到当需要新增一个类的品牌的时候需要新增多个子类,必须新增捷豹,此时也需要新增跑车、轿车、suv,而新增一个皮卡车的时候可能也需要在奔驰、宝马、奥迪中新增子类。此时你会发现这样处理,类多的有点爆炸了。这时候就可以通过桥接模式来解决这个问题
二 桥接模式结构图
把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展
- Client类:桥接模式的调用者
- 抽象类(Abstraction) :维护了 Implementor / 即它的实现类ConcreteImplementorA…, 二者是聚合关系,Abstraction 充当桥接类
- RefinedAbstraction:是 Abstraction抽象类的子类
- Implementor:行为实现类的接口
- ConcretelmplementorA/B: 行为的具体实现类
在car里面聚合brand让brand和car桥接关联起来,brand起到桥接作用
三 桥接模式实现
申明汽车品牌
public interface Brand {
/**
* 品牌信息
*/
void info();
}
申明不同品牌的实现
public class BaoMa implements Brand {
@Override
public void info() {
System.out.print("宝马汽车");
}
}
public class BenCi implements Brand{
@Override
public void info() {
System.out.print("奔驰汽车");
}
}
申明汽车抽象
public abstract class Car {
private Brand brand;
public Car(Brand brand){
this.brand = brand;
}
/**
* 启动
*/
abstract void start();
/**
* 关闭
*/
abstract void close();
public void info(){
brand.info();
}
}
申明不同汽车类型的抽象实现
public class SportsCar extends Car{
public SportsCar(Brand brand) {
super(brand);
}
@Override
void start() {
super.info();
System.out.println("启动");
}
@Override
void close() {
super.info();
System.out.println("关闭");
}
}
public class SuvCar extends Car{
public SuvCar(Brand brand) {
super(brand);
}
@Override
void start() {
super.info();
System.out.println("启动");
}
@Override
void close() {
super.info();
System.out.println("关闭");
}
}
客户端调用
public class Client {
public static void main(String[] args) {
Brand baoMa = new BaoMa();
SportsCar baoMaSportCar = new SportsCar(baoMa);
baoMaSportCar.start();
baoMaSportCar.close();
Brand benCi = new BenCi();
SportsCar benCiSportsCar = new SportsCar(benCi);
benCiSportsCar.start();
benCiSportsCar.close();
}
}
运行结果:
宝马汽车启动
宝马汽车关闭
奔驰汽车启动
奔驰汽车关闭
四 总结
优点:
- 1.实现了抽象和实现部分的分离 桥接模式分离了抽象部分和实现部分,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来。
- 2.更好的可扩展性 由于桥接模式把抽象部分和实现部分分离了,分别定义接口,这有助于系统进行分层设计,从而产生更好的结构化系统。对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了。
- 3.更好的可扩展性
缺点:
-
1.桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程。
-
2.桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性。