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