Bridge的精髓就是书上常说的“ 把抽象和实现解耦,使得它们可以独立地变化”
1.开关,风扇与电灯:
在实际生活中,我们利用开关(各式各样的开关)来操纵电灯(电器之类)。那么问题来了,如果电灯坏了,我们仅仅只要更换灯泡这个对象,而开关无需一起更换。这映射出面向对象的愿望:各司其职,开关和电器之间借由电线这个桥梁履行着各自的职责,并互不干扰。这就是著名的Bridge模式。
ToggleSwitch并不是指专用于打开电灯的开关,可以想象为上下波动型开关。RotarySwitch 可想象为旋钮型开关。
2.蜡笔,毛笔的选择:
如果要完成一幅巨作,有大片的蓝色天空,线条轮廓清晰的房屋。选择蜡笔,先买了一盒12色的小口径蜡笔,天空画了一半,我血都吐出来了,什么鬼,这小小支的蜡笔要涂到什么时候,于是我又买来了12色大口径的蜡笔,这样我一挥一来,天空就好了,内心欢喜。然后我又想买12色的中口径、12色另些口径,,,慢慢的,蜡笔填满了我的钱包,我追求的世界和平呢?终于我开始思考,诶,我用毛笔吧。说真,买三种型号(大,中,小)毛笔,再买来12色的水彩原料,我的世界也就光明起来,真是很天才的想法。
这是我关于Bridge最爱的例子,将面向对象诠释的生动。你看:
1.蜡笔由于不能将大小与颜色解耦,所以不及毛笔的灵活性。就是对抽象和耦合的最精彩概述。
2.毛笔将型号、颜色归类,不就是封装的精髓。
3.那句“各司其职,职责单一”,在毛笔与水彩原料的设计上,简直凶残的体现。
下面就是一堆代码的实现了,理解思想,编码就任游星空了。
public interface Equipment{
void powerOn();
void powerOff();
}
public class LightEquipment implements Equipment{
@override
public void powerOn(){
System.out.println("Light ON");
}
@override
public void powerOff(){
System.out.println("Light OFF");
}
}
public class FanEquipment implements Equipment{
@override
public void powerOn(){
System.out.println("Fan ON");
}
@override
public void powerOff(){
System.out.println("Fan OFF");
}
}
public class Switch{
private Equipment equipment;
...
//equipment的setter,getter方法
public void on(){
//开启开关的操作
System.out.println("Switch ON");
equipment.powerOn();
}
public void off(){
//关闭开关的操作
System.out.println("Switch OFF");
equipment.powerOff();
}
}
public class RotarySwitch extends Switch{
}
public class ToggleSwitch extends Switch{
}
public void static main(String[] args){
Switch toggleSwitch= new ToggleSwitch(); //拨动型开关
Switch rotarySwitch= new RotarySwitch(); //旋钮型开关
toggleSwitch.setEquipment(new Light()); //电灯使用拨动型开关
toggleSwitch.on();
toggleSwitch.off();
//fan...
}
正如上面例子所示:
若电灯使用不再使用拨动开关,而换成旋钮开关,则只需做如下变化,将各对象解耦:
rotarySwitch.setEquipment(new Light()); //电灯使用旋钮型开关
以上类图使用ProcessOn所绘,www.processon.com
划破距离长空,识得人间。
近安
ooooor