您的位置:首页 > 其它

向Bridge模式招手

2015-10-15 14:33 190 查看
由“理论到实践”的体系,在我看来也是纯属扯淡,设计模式由极多的重复案例中总结出来的。下面是Bridge模式的具体应用场景。


提起Bridge,有几个最经典的案例:

1.开关,风扇与电灯:

在实际生活中,我们利用开关(各式各样的开关)来操纵电灯(电器之类)。那么问题来了,如果电灯 坏了,我们仅仅只要更换灯泡这个对象,而开关无需一起更换。这映射出面向对象希望世界和平的愿望,我们稍微动个小拇指都能想到,开关和电器之间借由电线这个桥梁履行着各自的职责,并互不干扰。这就是著名的Bridge模式。

ToggleSwitch并不是指专用于打开电灯的开关,可以想象为上下波动型开关。RotarySwitch 可想象为旋钮型开关。



2.蜡笔,毛笔的选择:

这个例子基于蜡笔还是那个每根颜色确定,不能更改的老式的世界框架内。。你想问为什么,why,什么鬼,其实是这个样子的,如果要完成一幅巨作,有大片的蓝色天空,线条轮廓清晰的房屋。我举手选择蜡笔,先买了一盒12色的小口径蜡笔,天空画了一半,我血都吐出来了,什么鬼,这小小支的蜡笔老子要涂到什么时候,于是我又买来了12色大口径的蜡笔,这样我一挥一来,天空就好了,内心是十分开心。然后我又想买12色的中口径、12色另些口径,,,慢慢的,蜡笔填满了我的钱包,我追求的世界和平呢?终于我开始思考,诶,我用毛笔吧。说真,买三种型号(大,中,小)毛笔,再买来12色的水彩原料,我的世界也就光明起来,真是很天才的想法。

这是我关于Bridge最爱的例子,简直将面向对象诠释的不能不能的。你看你看:

1.蜡笔由于不能将大小与颜色解耦,所以不及毛笔的灵活性。就是对抽象和耦合的最精彩概述。

2.毛笔将型号、颜色归类,不就是封装的精髓嘛。

3.那句“各司其职,职责单一”,在毛笔与水彩原料的设计上,简直凶残的体现。



3.男友,礼物:

本想提两个例子就觉得足够了,不过后来想到这个,觉得有必要和朋友们哭诉一下现实的残忍。话说事情是这样子嗒,对于少女(女孩,女人,女性)而言,简单将男友分为冷酷、温暖等等类,礼物分为玫瑰、戒指等等。然后呢,你知道的,男友和礼物是可以随机组合的,管你张三李四,只不过是一个附带礼物的高度抽象类(不要喷我,只是比喻),即使你们换了男友,还是收到相同礼物(简直残忍),这就是现实。嘿,朋友们,这也就是Bridge的思想“将抽象化(男友)和实现化(礼物)解耦(二者微弱的关联),让他们独立变化”。

好,同志们,下面就是一堆代码的实现了,理解了思想,编码就任游星空,千万不要让代码束缚了思想。

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...
}


Bridge的精髓就是书上常说的“ 把抽象和实现解耦,使得它们可以独立地变化”,正如上面例子所示:

若电灯使用不再使用拨动开关,而换成旋钮开关,则只需做如下变化,将各对象解耦:

rotarySwitch.setEquipment(new Light());    //电灯使用旋钮型开关


以上类图使用ProcessOn所绘,www.processon.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Bridge 设计模式