向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
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- PHP设计模式之装饰者模式代码实例
- php设计模式之单例模式实例分析
- 介绍php设计模式中的工厂模式
- PHP设计模式之适配器模式代码实例
- 深入浅出23种设计模式
- 浅谈c#设计模式之单一原则
- C#设计模式之观察者模式实例讲解
- C#设计模式之单例模式实例讲解
- 深入理解JavaScript系列(28):设计模式之工厂模式详解
- 面向对象设计模式的核心法则
- JavaScript设计模式之单件模式介绍
- 深入理解JavaScript系列(25):设计模式之单例模式详解
- JavaScript设计模式之外观模式实例