什么是桥接模式?
将抽象部分与实现部分分离,使得各自变化独立自主。
现实中我们常见的桥主要作用是连接两地,这个两地就是抽象和实现两个地方,通过桥接把他们连接起来,而各自的发展不受影响。
桥接模式适用场景
想使你的代码更加灵活,易于扩展;
一个类存在两个以上的独立变化,而且这些变化需要自行扩展。
桥接模式中的角色
- Abstraction(抽象部分)
- Refined Abstraction(抽象的具体类)
- Implementor(实现部分)
- ConcreteImplementor(实现的具体类)
- Client(客户端)
结合例子来理解吧,我们去楼下麦克风买红茶,规格有大杯、中杯,需求样式有加冰和不加冰两种。
类图如下:
Abstraction(抽象部分):Cup类
public abstract class Cup{
Style style;
public Cup(Style mStyle){
style = mStyle;
}
abstract void makeTea();
}
Refined Abstraction(抽象的具体类):LargeCup类和MiddleCup类
//LargeCup
public class LargeCup extends Cup{
public LargeCup(Style style){
super(style);
}
public void makeTea(){
System.out.println("我是大杯"+style+"的红茶");
}
}
//MiddleCup
public class MiddleCup extends Cup{
public MiddleCup(Style style){
super(style);
}
public void makeTea(){
System.out.println("我是中杯"+style+"的红茶");
}
}
Implementor(实现部分):Style类
public abstract class Style{
abstract void addSth();
}
ConcreteImplementor(实现的具体类):IceStyle类和NothingStyle类
//加冰
public class IceStyle extends Style{
void addSth(){
System.out.println("加冰");
}
}
//不加冰,常温
public class NothingStyle extends Style{
void addSth(){
System.out.println("常温");
}
}
Client客户端调用:
public class Test{
public static void main(String[] args){
//大杯加冰
Cup cup = new LargeCup(new IceStyle());
cup.makeTea();
}
}
输出结果:
我是大杯加冰红茶
总结:
优点:
适配器模式和桥接模式有些相似都是中间人,不过适配器模式旨在改变目标,来适配自己。而桥接模式没有要改变谁,而是更得心应手的让类的扩展性更高,比如现在,我想加入一个小杯的规格,只需要实现Cup的SmallCup类即可,加冰不加冰对于他来说是独立的,无影响的。这样整个系统耦合更低,扩展容易。
缺点:不太容易设计,对于初学者来说把握好抽象和实现的分离是一个问题?什么时候?怎么分离?对开发来说要有一定经验要求。
注意
定义里所讲将抽象与实现分离,说的并不是同一个类的抽象以及其子类的实现,而是对两个甚至多个不同类而言的,比如例子中的抽象部分可能是Cup类,实现部分可能是Style类,但并不是那么绝对的。抽象与实现对应的是两个独立变化的对象,重点在于理解独立变化的对象上,而并不在抽象和实现的定义上。