转载请注明出处:http://blog.csdn.net/zhshulin
桥接模式
桥接模式的定义:将抽象部分与实现部分分离,使它们都可以独立的变化
桥接模式是所有面向对象模式的基础,通过对桥接模式的学习来理解设计模式的思想,理由如下:
1、它教导如何思考抽象,这是面向对象设计模式的关键概念。
2、它实现了基本的OOD原则。
3、它容易理解。
4、如果正确理解该模式,学习其他模式会很容易。
假设以下场景
我们房间里有些电器(电灯,风扇等) 这些设备按照某些方式布局,并有开关控制,任何时候你都能替换或排查一个电器而不用碰到其他东西,例如,你可以换一个电灯而不需要换开关,同样你可以换一个开关或排查它而不需要碰到或替换相应的电灯或风扇,甚至你可以把电灯连接到风扇开关上,把风扇连到电灯的开关上,而不需要碰到开关。
当不同东西联系在一起时,它们应该按照一定方式联系:修改或替换一个系统时不会影响到另一个,或者说即便有,也应该最小化。这能够让你的系统易于管理,且成本低
把电灯/风扇和开关联系到一起的是电线和电器布局。我们可以它们看做不同系统间相互联系的桥梁。其基本的思想是,一个事物不能和另一外一个事物直接联系。它们应当通过某些桥梁或接口联系在一起。用软件术语来说,这叫“松耦合”。
例子中我们有开关,可能有几种开关,如普通的开关,漂亮的开关,但通常来说它们还是开关,并且每种开关都能够打开和关闭。
//先写一个开关的父类Switch:
public class Switch {
public void On(){}
public void Off(){}
}
//其他的具体开关继承这个父类
public class FancySwitch extends Switch {
public void on(){
System.out.println("打开开关");
}
public void off(){
System.out.println("关闭开头");
}
}
public class NormalSwitch extends Switch {
public void on(){
System.out.println("打开开关!!!!");
}
public void off(){
System.out.println("关闭开关!!!!");
}
}
//对于电灯和电扇等具体的电器,根据OODP的开放闭合原则,我们知道只要可能,就应该尝试抽象
//跟开关不一样,风扇和电灯等是两种不同的事物。对于开关,我们能够使用一个开关基类Switch,但风扇和电灯是两个不同的事物,相比定义一个基类,接口可能更合适。一般来说,他们都是电器。所以我们可以定义一个接口,如IElectricalEquipment,作为对电灯和风扇的抽象
public interface IElectricalEquipment{
public void PowerOn();//每个电器可以打开
public void powerOff();//每个电器都可以关闭
}
//现在我们需要一座桥梁。在现实中,电线是桥梁。在我们对象设计中,开关知道如何打开和关闭电器,电器以某种方式联系到开关。这里我们没有电线,让电器连接到开关的唯一方式是封装。但开关不能直接知道风扇或电灯。开关应当知道一个电器IElectricalEquipment能够打开或关闭。这意味着,Switch应该有一个IElectricalEquipment实例。
//对风扇或电灯的封装的实例是一个桥梁。所以让我们修改Switch类以便封装一个电器:
public class Switch{
public IElectricalEquipment iEquip;
public IelectricalEquipment getEquip(){
return iEquip;
}
public void setiEquip(IElectricalEquipment iEquip){
this.iEquip = iEquip;
}
public void On(){}
public void Off(){}
}
//电扇
public class Fan implements IElectricalEquipment{
@Override
public void powerOn(){
System.out.println("打开电扇");
}
@Override
public void powerOff(){
System.out.println("关闭电扇");
}
}
//电灯
public class Light implements IElectricalEquipment {
@Override
public void powerOn() {
System.out.println("打开电灯!");
}
@Override
public void powerOff() {
System.out.println("电灯关闭!");
}
}
//开关控制电器
public class BridgeModeDemo {
public static void main(String[] args) {
Switch fancySwitch = new FancySwitch(); //实例化漂亮的开关
Switch normalSwitch = new NormalSwitch(); //实例化普通开关
IElectricalEquipment fan = new Fan(); //实例化电风扇
IElectricalEquipment light = new Light(); //实例化电灯
normalSwitch.setiEquip(light);
fancySwitch.setiEquip(fan);
fancySwitch.getiEquip().powerOn(); //此时具体的开关和电扇连接起来了
normalSwitch.getiEquip().powerOn(); //打开电灯
}
}