门面模式

来源:互联网 发布:大数据解决方案工程师 编辑:程序博客网 时间:2024/06/08 01:56

医院的例子:
用一个例子进行说明,如果把医院作为一个子系统,这个系统可以划分为挂号,门诊,划价,化验,收费,取药等.看病的病人要与这些部门打交道,就如同一个子系统的客户端与一个子系统的各个类打交道一样,不是一件容易的事情.
首先病人必须先挂号,然后门诊.如果医生要求化验,病人必须首先划价,然后缴款,才能到化验部门做化验.最后回到诊室.
解决这种不便的方法便是引进门面模式.仍然通过医院的例子说明.可以设置一个接待员的位置,由接待员负责代为挂号,划价,缴费,取药等.这个接待员就是门面模式的体现,病人只接触接待员,由接待员负责与医院的各个部门打交道.

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

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

为一个复杂子系统提供一个简单接口.
子系统往往因为不断深化而变得越来越复杂,使用门面模式可以使得子系统更具可得可利用性.Facade模式可以提供一个简单的默认视图,对大多数用户来说这个视力已经足够用了,而那些需要进一步继承的用户可以越过Facade层直接对子系统进行继承.

子系统的独立性.
一般而言,子系统和其他的子系统之间,客户端与实现化层之间存在着很大的依赖性,引入Facade模式将一个子系统与它的客户端以及其他的子系统分离,可以提高子系统的独立性和可移值性.

层次化结构.
在构建一个层次化的系统时,可以使用Facade模式定义系统中的每一层的入口,如果层与层之间是相互依赖的,则可以限定它们公通过Facade进行通信,从而简化了层与层之间的依赖关系.

示例:
public class Client
{
 private static SecurityFacade security;
 
 public static void main(String[] args
 {
  security.activate();
 }
}

public class SecurityFacade
{
 private Camera camera1, camera2;
 private Light light1, light2, light3;
 private Sensor sensor;
 private Alarm alarm;
 
 public void activete()
 {
  camera1.turnOn();
  camera2.turnOn();
  light1.turnOn();
  light2.turnOn();
  light3.turnOn();
  sensor.turnOn();
  alarm.activate();
 }
 
 public void deactivate()
 {
  camera1.turnOff();
  camera2.turnOff();
  light1.turnOff();
  light2.turnOff();
  light3.turnOff();
  sensor.turnOff();
  alarm.deactivate();
 }
}

public class Camera{...}
public class Light{...}
public class Sensor{...}
public class Alarm{...}