码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式(15)-Facade Pattern

时间:2014-11-22 11:57:24      阅读:263      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   ar   color   使用   sp   java   

http://www.cnblogs.com/zhenyulu/articles/55992.html

一、 门面(Facade)模式

外部与一个子系统的通信必须通过一个统一的门面(Facade)对象进行,这就是门面模式。

医院的例子

用一个例子进行说明,如果把医院作为一个子系统,按照部门职能,这个系统可以划分为挂号、门诊、划价、化验、收费、取药等。看病的病人要与这些部门打交道,就如同一个子系统的客户端与一个子系统的各个类打交道一样,不是一件容易的事情。

首先病人必须先挂号,然后门诊。如果医生要求化验,病人必须首先划价,然后缴款,才能到化验部门做化验。化验后,再回到门诊室。

解决这种不便的方法便是引进门面模式。可以设置一个接待员的位置,由接待员负责代为挂号、划价、缴费、取药等。这个接待员就是门面模式的体现,病人只接触接待员,由接待员负责与医院的各个部门打交道。

什么是门面模式

门面模式要求一个子系统的外部与其内部的通信必须通过一个统一的门面(Facade)对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。

就如同医院的接待员一样,门面模式的门面类将客户端与子系统的内部复杂性分隔开,使得客户端只需要与门面对象打交道,而不需要与子系统内部的很多对象打交道。


二、 门面模式的结构

门面模式是对象的结构模式。门面模式没有一个一般化的类图描述,下图演示了一个门面模式的示意性对象图:

 bubuko.com,布布扣

在这个对象图中,出现了两个角色:

门面(Facade)角色:客户端可以调用这个角色的方法。此角色知晓相关的(一个或者多个)子系统的功能和责任。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去。

子系统(subsystem)角色:可以同时有一个或者多个子系统。每一个子系统都不是一个单独的类,而是一个类的集合。每一个子系统都可以被客户端直接调用,或者被门面角色调用。子系统并不知道门面的存在,对于子系统而言,门面仅仅是另外一个客户端而已。


三、 门面模式的实现

一个系统可以有几个门面类

【GOF】的书中指出:在门面模式中,通常只需要一个门面类,并且此门面类只有一个实例,换言之它是一个单例类。当然这并不意味着在整个系统里只能有一个门面类,而仅仅是说对每一个子系统只有一个门面类。或者说,如果一个系统有好几个子系统的话,每一个子系统有一个门面类,整个系统可以有数个门面类。

为子系统增加新行为

初学者往往以为通过继承一个门面类便可在子系统中加入新的行为,这是错误的。门面模式的用意是为子系统提供一个集中化和简化的沟通管道,而不能向子系统加入新的行为。


四、 在什么情况下使用门面模式

  • 为一个复杂子系统提供一个简单接口
  • 提高子系统的独立性
  • 在层次化结构中,可以使用Facade模式定义系统中每一层的入口。


五、 一个例子

我们考察一个保安系统的例子,以说明门面模式的功效。一个保安系统由两个录像机、三个电灯、一个遥感器和一个警报器组成。保安系统的操作人员需要经常将这些仪器启动和关闭。

不使用门面模式的设计

首先,在不使用门面模式的情况下,操作这个保安系统的操作员必须直接操作所有的这些部件。下图所示就是在不使用门面模式的情况下系统的设计图。

 bubuko.com,布布扣


可以看出,Client对象需要引用到所有的录像机(Camera)、电灯(Light)、感应器(Sensor)和警报器(Alarm)对象。代码如下:

bubuko.com,布布扣using System;
bubuko.com,布布扣
bubuko.com,布布扣public class Camera
bubuko.com,布布扣{
bubuko.com,布布扣  public void TurnOn()
bubuko.com,布布扣  {
bubuko.com,布布扣    Console.WriteLine("Turning on the camera.");
bubuko.com,布布扣  }
bubuko.com,布布扣
bubuko.com,布布扣  public void TurnOff()
bubuko.com,布布扣  {
bubuko.com,布布扣    Console.WriteLine("Turning off the camera.");
bubuko.com,布布扣  }
bubuko.com,布布扣
bubuko.com,布布扣  public void Rotate(int degrees)
bubuko.com,布布扣  {
bubuko.com,布布扣    Console.WriteLine("Rotating the camera by {0} degrees.", degrees);
bubuko.com,布布扣  }
bubuko.com,布布扣}
bubuko.com,布布扣
bubuko.com,布布扣public class Light
bubuko.com,布布扣{
bubuko.com,布布扣
bubuko.com,布布扣  public void TurnOff()
bubuko.com,布布扣  {
bubuko.com,布布扣    Console.WriteLine("Turning on the light.");
bubuko.com,布布扣  }
bubuko.com,布布扣
bubuko.com,布布扣  public void TurnOn()
bubuko.com,布布扣  {
bubuko.com,布布扣    Console.WriteLine("Turning off the light.");
bubuko.com,布布扣  }
bubuko.com,布布扣
bubuko.com,布布扣  public void ChangeBulb()
bubuko.com,布布扣  {
bubuko.com,布布扣    Console.WriteLine("changing the light-bulb.");
bubuko.com,布布扣  }
bubuko.com,布布扣}
bubuko.com,布布扣
bubuko.com,布布扣public class Sensor
bubuko.com,布布扣{
bubuko.com,布布扣  public void Activate()
bubuko.com,布布扣  {
bubuko.com,布布扣    Console.WriteLine("Activating the sensor.");
bubuko.com,布布扣  }
bubuko.com,布布扣
bubuko.com,布布扣  public void Deactivate()
bubuko.com,布布扣  {
bubuko.com,布布扣    Console.WriteLine("Deactivating the sensor.");
bubuko.com,布布扣  }
bubuko.com,布布扣
bubuko.com,布布扣  public void Trigger()
bubuko.com,布布扣  {
bubuko.com,布布扣    Console.WriteLine("The sensor has triggered.");
bubuko.com,布布扣  }
bubuko.com,布布扣}
bubuko.com,布布扣
bubuko.com,布布扣public class Alarm
bubuko.com,布布扣{
bubuko.com,布布扣
bubuko.com,布布扣  public void Activate()
bubuko.com,布布扣  {
bubuko.com,布布扣    Console.WriteLine("Activating the alarm.");
bubuko.com,布布扣  }
bubuko.com,布布扣
bubuko.com,布布扣  public void Deactivate()
bubuko.com,布布扣  {
bubuko.com,布布扣    Console.WriteLine("Deactivating the alarm.");
bubuko.com,布布扣  }
bubuko.com,布布扣
bubuko.com,布布扣  public void Ring()
bubuko.com,布布扣  {
bubuko.com,布布扣    Console.WriteLine("Ringing the alarm.");
bubuko.com,布布扣  }
bubuko.com,布布扣
bubuko.com,布布扣  public void StopRing()
bubuko.com,布布扣  {
bubuko.com,布布扣    Console.WriteLine("Stop the alarm.");
bubuko.com,布布扣  }
bubuko.com,布布扣}
bubuko.com,布布扣
bubuko.com,布布扣public class Client
bubuko.com,布布扣{
bubuko.com,布布扣  private static Camera camera1, camera2;
bubuko.com,布布扣  private static Light light1, light2, light3;
bubuko.com,布布扣  private static Sensor sensor;
bubuko.com,布布扣  private static Alarm alarm;
bubuko.com,布布扣
bubuko.com,布布扣  static Client()
bubuko.com,布布扣  {
bubuko.com,布布扣    camera1 = new Camera();
bubuko.com,布布扣    camera2 = new Camera();
bubuko.com,布布扣    light1 = new Light();
bubuko.com,布布扣    light2 = new Light();
bubuko.com,布布扣    light3 = new Light();
bubuko.com,布布扣    sensor = new Sensor();
bubuko.com,布布扣    alarm = new Alarm();
bubuko.com,布布扣  }  
bubuko.com,布布扣
bubuko.com,布布扣  public static void Main( string[] args )
bubuko.com,布布扣  {
bubuko.com,布布扣    camera1.TurnOn();
bubuko.com,布布扣    camera2.TurnOn();
bubuko.com,布布扣    light1.TurnOn();
bubuko.com,布布扣    light2.TurnOn();
bubuko.com,布布扣    light3.TurnOn();
bubuko.com,布布扣    sensor.Activate();
bubuko.com,布布扣    alarm.Activate();
bubuko.com,布布扣  }
bubuko.com,布布扣}

 

六、 使用门面模式的设计

一个合情合理的改进方法就是准备一个系统的控制台,作为保安系统的用户界面。如下图所示:

 bubuko.com,布布扣

程序代码如下:

bubuko.com,布布扣using System;
bubuko.com,布布扣
bubuko.com,布布扣public class Camera
bubuko.com,布布扣{
bubuko.com,布布扣  public void TurnOn()
bubuko.com,布布扣  {
bubuko.com,布布扣    Console.WriteLine("Turning on the camera.");
bubuko.com,布布扣  }
bubuko.com,布布扣
bubuko.com,布布扣  public void TurnOff()
bubuko.com,布布扣  {
bubuko.com,布布扣    Console.WriteLine("Turning off the camera.");
bubuko.com,布布扣  }
bubuko.com,布布扣
bubuko.com,布布扣  public void Rotate(int degrees)
bubuko.com,布布扣  {
bubuko.com,布布扣    Console.WriteLine("Rotating the camera by {0} degrees.", degrees);
bubuko.com,布布扣  }
bubuko.com,布布扣}
bubuko.com,布布扣
bubuko.com,布布扣public class Light
bubuko.com,布布扣{
bubuko.com,布布扣
bubuko.com,布布扣  public void TurnOff()
bubuko.com,布布扣  {
bubuko.com,布布扣    Console.WriteLine("Turning on the light.");
bubuko.com,布布扣  }
bubuko.com,布布扣
bubuko.com,布布扣  public void TurnOn()
bubuko.com,布布扣  {
bubuko.com,布布扣    Console.WriteLine("Turning off the light.");
bubuko.com,布布扣  }
bubuko.com,布布扣
bubuko.com,布布扣  public void ChangeBulb()
bubuko.com,布布扣  {
bubuko.com,布布扣    Console.WriteLine("changing the light-bulb.");
bubuko.com,布布扣  }
bubuko.com,布布扣}
bubuko.com,布布扣
bubuko.com,布布扣public class Sensor
bubuko.com,布布扣{
bubuko.com,布布扣  public void Activate()
bubuko.com,布布扣  {
bubuko.com,布布扣    Console.WriteLine("Activating the sensor.");
bubuko.com,布布扣  }
bubuko.com,布布扣
bubuko.com,布布扣  public void Deactivate()
bubuko.com,布布扣  {
bubuko.com,布布扣    Console.WriteLine("Deactivating the sensor.");
bubuko.com,布布扣  }
bubuko.com,布布扣
bubuko.com,布布扣  public void Trigger()
bubuko.com,布布扣  {
bubuko.com,布布扣    Console.WriteLine("The sensor has triggered.");
bubuko.com,布布扣  }
bubuko.com,布布扣}
bubuko.com,布布扣
bubuko.com,布布扣public class Alarm
bubuko.com,布布扣{
bubuko.com,布布扣
bubuko.com,布布扣  public void Activate()
bubuko.com,布布扣  {
bubuko.com,布布扣    Console.WriteLine("Activating the alarm.");
bubuko.com,布布扣  }
bubuko.com,布布扣
bubuko.com,布布扣  public void Deactivate()
bubuko.com,布布扣  {
bubuko.com,布布扣    Console.WriteLine("Deactivating the alarm.");
bubuko.com,布布扣  }
bubuko.com,布布扣
bubuko.com,布布扣  public void Ring()
bubuko.com,布布扣  {
bubuko.com,布布扣    Console.WriteLine("Ringing the alarm.");
bubuko.com,布布扣  }
bubuko.com,布布扣
bubuko.com,布布扣  public void StopRing()
bubuko.com,布布扣  {
bubuko.com,布布扣    Console.WriteLine("Stop the alarm.");
bubuko.com,布布扣  }
bubuko.com,布布扣}
bubuko.com,布布扣
bubuko.com,布布扣public class SecurityFacade
bubuko.com,布布扣{
bubuko.com,布布扣  private static Camera camera1, camera2;
bubuko.com,布布扣  private static Light light1, light2, light3;
bubuko.com,布布扣  private static Sensor sensor;
bubuko.com,布布扣  private static Alarm alarm;
bubuko.com,布布扣
bubuko.com,布布扣  static SecurityFacade()
bubuko.com,布布扣  {
bubuko.com,布布扣    camera1 = new Camera();
bubuko.com,布布扣    camera2 = new Camera();
bubuko.com,布布扣    light1 = new Light();
bubuko.com,布布扣    light2 = new Light();
bubuko.com,布布扣    light3 = new Light();
bubuko.com,布布扣    sensor = new Sensor();
bubuko.com,布布扣    alarm = new Alarm();
bubuko.com,布布扣  }
bubuko.com,布布扣  
bubuko.com,布布扣  public void Activate()
bubuko.com,布布扣  {
bubuko.com,布布扣    camera1.TurnOn();
bubuko.com,布布扣    camera2.TurnOn();
bubuko.com,布布扣    light1.TurnOn();
bubuko.com,布布扣    light2.TurnOn();
bubuko.com,布布扣    light3.TurnOn();
bubuko.com,布布扣    sensor.Activate();
bubuko.com,布布扣    alarm.Activate();
bubuko.com,布布扣  }
bubuko.com,布布扣
bubuko.com,布布扣  public void Deactivate()
bubuko.com,布布扣  {
bubuko.com,布布扣    camera1.TurnOff();
bubuko.com,布布扣    camera2.TurnOff();
bubuko.com,布布扣    light1.TurnOff();
bubuko.com,布布扣    light2.TurnOff();
bubuko.com,布布扣    light3.TurnOff();
bubuko.com,布布扣    sensor.Deactivate();
bubuko.com,布布扣    alarm.Deactivate();
bubuko.com,布布扣  }
bubuko.com,布布扣}
bubuko.com,布布扣
bubuko.com,布布扣public class Client
bubuko.com,布布扣{
bubuko.com,布布扣  private static SecurityFacade security;
bubuko.com,布布扣
bubuko.com,布布扣  public static void Main( string[] args )
bubuko.com,布布扣  {
bubuko.com,布布扣    security = new SecurityFacade();
bubuko.com,布布扣    security.Activate();
bubuko.com,布布扣    Console.WriteLine("\n--------------------\n");
bubuko.com,布布扣    security.Deactivate();
bubuko.com,布布扣  }
bubuko.com,布布扣}

 

 


 

参考文献:
阎宏,《Java与模式》,电子工业出版社
[美]James W. Cooper,《C#设计模式》,电子工业出版社
[美]Alan Shalloway  James R. Trott,《Design Patterns Explained》,中国电力出版社
[美]Robert C. Martin,《敏捷软件开发-原则、模式与实践》,清华大学出版社
[美]Don Box, Chris Sells,《.NET本质论 第1卷:公共语言运行库》,中国电力出版社

设计模式(15)-Facade Pattern

标签:des   style   blog   http   ar   color   使用   sp   java   

原文地址:http://www.cnblogs.com/123ing/p/4114827.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!