介绍
简单来讲,桥接模式是一个两层的抽象。
桥接模式是用于“把抽象和实现分开,这样它们就能独立变化”。 桥接模式使用了封装、聚合,可以用继承将不同的功能拆分为不同的类。
1.桥接模式的故事
电视和遥控器(图中有错字)是一个完美展示两层抽象的例子。你有一个电视机的接口,还有一个遥控器的抽象类。我们都知道,将它们中任何一个定义为一个具体类都不是好办法,因为其它厂家会有不同的实现方法。
2. 桥接模式Java示例代码
首先定义电视机的接口:ITV
public interface ITV {
public void on();
public void off();
public void switchChannel(int channel);
}
实现三星的 ITV 接口。
public class SamsungTV implements ITV {
@Override
public void on() {
System.out.println("Samsung is turned on.");
}
@Override
public void off() {
System.out.println("Samsung is turned off.");
}
@Override
public void switchChannel(int channel) {
System.out.println("Samsung: channel - " + channel);
}
}
再实现索尼的ITV接口。
public class SonyTV implements ITV {
@Override
public void on() {
System.out.println("Sony is turned on.");
}
@Override
public void off() {
System.out.println("Sony is turned off.");
}
@Override
public void switchChannel(int channel) {
System.out.println("Sony: channel - " + channel);
}
}
遥控器要包含对TV的引用。
public abstract class AbstractRemoteControl {
/**
* @uml.property name="tv"
* @uml.associationEnd
*/
private ITV tv;
public AbstractRemoteControl(ITV tv){
this.tv = tv;
}
public void turnOn(){
tv.on();
}
public void turnOff(){
tv.off();
}
public void setChannel(int channel){
tv.switchChannel(channel);
}
}
定义遥控器的具体类。
public class LogitechRemoteControl extends AbstractRemoteControl {
public LogitechRemoteControl(ITV tv) {
super(tv);
}
public void setChannelKeyboard(int channel){
setChannel(channel);
System.out.println("Logitech use keyword to set channel.");
}
}
public class Test {
public static void main(String[] args){
ITV tv = new SonyTV();
LogitechRemoteControl lrc = new LogitechRemoteControl(tv);
lrc.setChannelKeyboard(100);
}
}
输出如下:
Sony: channel – 100
Logitech use keyword to set channel.
总结一下, 桥接模式允许两层实现的抽象,上面的电视机和遥控器就是很好的例子。可见,桥接模式提供了更多的灵活性。
个人理解:桥接是一个接口,它与一方应该是绑定的,也就是解耦的双方中的一方必然是继承这个接口的,这一方就是实现方,而另一方正是要与这一方解耦的抽象方,如果不采用桥接模式,一般我们的处理方式是直接使用继承来实现,这样双方之间处于强链接,类之间关联性极强,如要进行扩展,必然导致类结构急剧膨胀。采用桥接模式,正是为了避免这一情况的发生,将一方与桥绑定,即实现桥接口,另一方在抽象类中调用桥接口(指向的实现类),这样桥方可以通过实现桥接口进行单方面扩展,而另一方可以继承抽象类而单方面扩展,而之间的调用就从桥接口来作为突破口,不会受到双方扩展的任何影响。
优缺点
优点:
- 抽象和实现的分离。
- 优秀的扩展能力。
- 实现细节对客户透明。
缺点:
- 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
实际应用的例子
- Java jdbc桥接模式
- 在Eclipse 架构使用的模式中,桥接模式占有重要的地位。
其他
- 《桥接模式和适配器模式的区别》这篇文章中讲到到的一个很精辟的观点:
桥接是先有桥,才有两端的东西;适配是先有两边的东西,才有适配器