1.门面模式(Facade)
门面模式是对象的结构模式。外部与一个子系统的通信必须通过一个统一门面(Facade)对象进行通信。门面对象通过对子系统功能的整理,给外界提供一个更高层,更简洁的接口。
2.门面模式结构
门面模式适合比较复杂大型的功能系统,一般描述的是子系统(功能模块)之间的关系,下面是用协作图来描述的门面模式。
从上述协作图可以看出,门面中只有两种角色:门面角色(Facade)和子系统(SubSystem)
(1)Facade:客户端可以调用这个角色的方法。通过此角色与多个子系统通信。可以有一个或者多个。
(2)SubSystem:系统的子系统,一个代表一个功能模块。对于子系统而言,门面也是一种客户端。
3.什么情况下使用门面模式
(1)为一个复杂子系统提供一个简单接口。
(2)引入门面模式,使得子系统与客户端或者其它子系统分离,提高子系统的独立性和可移植性。
(3)在构建一个层次化的系统时,可以使用Facade模式定义系统中每一层的入口,简化层与层之间的依赖关系。
4.一个例子
一个保安系统,由录像机、电灯、遥控器和警报器组成。操作人员经常需要开关这些装置。如果直接在客户端操作这些装置,客户端与这些装置的依赖变大,并且因为操作繁琐,可能会出现错误操作。
所以需要引入一个门面对象,将子系统的功能整理好,提供一个可服用的,简洁的接口。
从图中可以看出,系统有2个Camera、3个light(灯)、一个Sensor(摄像头)和一个alarm(警报),如果让client直接操作,比如开启所有装置,不光依赖严重,而且可维护性差。
源码:
SecurityFacade.java
package com.patterns.facade;
public class SecurityFacade
{
public static SecurityFacade me = new SecurityFacade();
private SecurityFacade(){};
/**
* 单例创建Facade
* @return
*/
public static SecurityFacade getInstance(){
return me;
}
private Camera camera1 = new Camera(), camera2 = new Camera();
private Light light1 = new Light(), light2 = new Light(), light3 = new Light();
private Sensor sensor = new Sensor();
private Alarm alarm = new Alarm();
/**
* 开启系统所有装置
*/
public void activate()
{
camera1.turnOn();
camera2.turnOn();
light1.turnOn();
light2.turnOn();
light3.turnOn();
sensor.activate();
alarm.activate();
}
public void deactivate()
{
camera1.turnOff();
camera2.turnOff();
light1.turnOff();
light2.turnOff();
light3.turnOff();
sensor.deactivate();
alarm.deactivate();
}
}
Camera.java
package com.patterns.facade;
public class Camera
{
public void turnOn()
{
System.out.println("Turning on the camera.");
}
public void turnOff()
{
System.out.println("Turning off the camera.");
}
public void rotate(int degrees)
{
System.out.println("Rotating the camera by " + degrees + " degrees.");
}
}
Light.java
package com.patterns.facade;
public class Light
{
public void turnOn()
{
System.out.println("Turning on the light.");
}
public void turnOff()
{
System.out.println("Turning off the light.");
}
public void changeBulb()
{
System.out.println("Changing the light-bulb.");
}
}
Sensor.java
package com.patterns.facade;
public class Sensor
{
public void activate()
{
System.out.println("Activating on the sensor.");
}
public void deactivate()
{
System.out.println("Deactivating on the sensor.");
}
public void trigger()
{
System.out.println("The sensor has been triggered.");
}
}
Alarm.java
package com.patterns.facade;
public class Alarm
{
public void activate()
{
System.out.println("Activating the alarm.");
}
public void deactivate()
{
System.out.println("Deactivating the alarm.");
}
public void ring()
{
System.out.println("Ring the alarm.");
}
public void stopRing()
{
System.out.println("Stop the alarm.");
}
}
Client.,java
package com.patterns.facade;
public class Client
{
private static SecurityFacade security ;
public static void main(String[] args)
{
security = SecurityFacade.getInstance();
security.activate();
}
}
运行结果:
Turning on the camera.
Turning on the camera.
Turning on the light.
Turning on the light.
Turning on the light.
Activating on the sensor.
Activating the alarm.