定义
Decouple an abstraction from its implementation so that the two can vary independently.
将抽象和实现解耦,使得两者可以独立地变化。
通过定义可知,桥接模式的意思就是将抽象和实现通过桥梁连接,到达解耦的目的。
UML图
如图,左半部分即为抽象,右半部分为实现,桥梁为实现化角色Implementor(抽象化角色Abstraction持有实现者角色,并在功能接口中委托给它,起到搭建桥梁的作用)
一般而言,桥接模式由4部分组成
● Abstraction —— 抽象化角色,它的主要职责是定义出该角色的行为,同时保存一个对实现化角色的引用,该角色一般是抽象类。
● Implementor —— 实现化角色,它是接口或者抽象类,定义角色必需的行为和属性。
● RefinedAbstraction —— 修正抽象化角色,它引用实现化角色对抽象化角色进行修正。
● ConcreteImplementor —— 具体实现化角色,它实现接口或抽象类定义的方法和属性。
下面通过JAVA全栈知识体系给出的例子具体看一下桥接模式的实现。
RemoteControl 表示遥控器,指代抽象化角色Abstraction
ConcreteRemoteControl代指修正抽象化角色RefinedAbstraction
TV 表示电视,指代实现化角色Implementor
Sony代指具体实现化角色ConcreteImplementor
桥接模式将遥控器和电视分离开来,从而可以独立改变遥控器或者电视的实现
代码
1.创建实现化角色Implementor — TV
public abstract class TV {
public abstract void on();
public abstract void off();
public abstract void tuneChannel();
}
2.创建具体实现化角色ConcreteImplementor — Sony
public class Sony extends TV {
@Override
public void on() {
System.out.println("Sony.on()");
}
@Override
public void off() {
System.out.println("Sony.off()");
}
@Override
public void tuneChannel() {
System.out.println("Sony.tuneChannel()");
}
}
3.创建抽象化角色Abstraction — RemoteControl
public abstract class RemoteControl {
//通过声明实现化角色来架设桥梁
protected TV tv;
public RemoteControl(TV tv) {
this.tv = tv;
}
public abstract void on();
public abstract void off();
public abstract void tuneChannel();
}
4.创建修正抽象化角色RefinedAbstraction — ConcreteRemoteControl
/**
作为抽象化角色的子类,增加新的功能,也就是增加新的接口(方法),与其构成类的功能层次结构
*/
public class ConcreteRemoteControl extends RemoteControl{
public ConcreteRemoteControl(TV tv) {
super(tv);
}
@Override
public void on() {
System.out.println("ConcreteRemoteControl.on()");
tv.on();
}
@Override
public void off() {
System.out.println("ConcreteRemoteControl.off()");
tv.off();
}
@Override
public void tuneChannel() {
System.out.println("ConcreteRemoteControl.tuneChannel()");
tv.tuneChannel();
}
}
5.测试
public class Test{
public static void main(String[] args) {
RemoteControl remoteControl = new ConcreteRemoteControl(new Sony());
remoteControl.on();
remoteControl.off();
remoteControl.tuneChannel();
}
}
上述代码将抽象部分与实现部分分离,使它们都可以独立的变化,桥接模式的关键是桥梁的连接,其体现在抽象化角色依赖了实现化角色,即 protected TV tv;。
总结
1.使用场景:
- 不希望或不适用使用继承的场景
- 接口或抽象类不稳定的场景
- 重用性要求较高的场景
2.优点:
1、通过将抽象和实现的分离,使代码解耦。 2、具有优秀的扩展能力。 3、实现细节对客户透明。
3.缺点:
桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。