首页 > 学院 > 开发设计 > 正文

设计模式——桥接模式(BridgeMode)

2019-11-10 20:21:42
字体:
来源:转载
供稿:网友

要想正确理解设计模式,首先必须明确它是为了解决什么问题而提出来的。

设计模式学习笔记

——Shulin

转载请注明出处:http://blog.csdn.net/zhshulin

桥接模式的定义:"将抽象部分与实现部分分离,使它们都可以独立的变化"。

桥接模式是所有面向对象模式的基础,通过对桥接模式的学习来理解设计模式的思想。理由如下:

1、它教导如何思考抽象,这是面向对象设计模式的关键概念。

2、它实现了基本的OOD原则。

3、它容易理解。

4、如果正确理解该模式,学习其他模式会很容易。

假设以下场景:

我们房间里有些电器(电灯,风扇等)。这些设备按照某些方式布局,并由开关控制。任何时候你都能替换或排查一个电器而不用碰到其他东西。例如,你可以换一个电灯而不需要换开关。同样,你可以换一个开关或排查它而不需要碰到或替换相应的电灯或风扇;甚至你可以用把电灯连接到风扇的开关上,把风扇连到电灯的开关上,而不需要碰到开关。

当不同东西联系在一起时,它们应该按照一定方式联系:修改或替换一个系统时不会影响到另一个,或者说即便有,也应该最小化。这能够让你的系统易于管理,且成本低。

把电灯/风扇和开关联系到一起的是电线和电器布局。我们可以它们看做不同系统间相互联系的桥梁。其基本的思想是,一个事物不能和另一外一个事物直接联系。它们应当通过某些桥梁或接口联系在一起。用软件术语来说,这叫“松耦合”。

例子中我们有开关,可能有几种开关,如普通的开关,漂亮的开关,但通常来说它们还是开关,并且每种开关都能够打开和关闭。

所以下面我们会有一个开关的父类Switch:

[java] view plain copy PRint?在CODE上查看代码片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(); //打开电灯      }    }  
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表