门面模式(facade)
1、门面模式
门面模式是对象的结构模式,是通过一个代理一些复杂而又繁琐的操作,客户端只需调用改类中的方法,不必关心后台复杂的操作。
2、结构
在结构图中包含两种角色
‘门面角色:客户端可以通过门面角色与各个子系统进行通信。
子系统角色:可以同时有一个或者多个
3、代码
(1)电灯类
public class Light {
public void turnOn(){
System.out.println("开启灯...");
}
public void turnOff(){
System.out.println("关闭灯...");
}
public void changeBulb(){
System.out.println("换灯泡...");
}
}
(2)相机类
public class Camera {
public void turnOn(){
System.out.println("开启相机...");
}
public void turnOff(){
System.out.println("关闭相机...");
}
public void rotate(){
System.out.println("转动相机...");
}
}
(3)传感器类
public class Sensor {
public void activate(){
System.out.println("启动传感器...");
}
public void deactivate(){
System.out.println("关闭传感器...");
}
public void trigger(){
System.out.println("出发传感器...");
}
}
(4)警报器类
public class Alarm {
public void activate(){
System.out.println("启动警报...");
}
public void deactivate(){
System.out.println("关闭警报...");
}
public void ring(){
System.out.println("触发警报...");
}
public void stopRing(){
System.out.println("关闭警报...");
}
}
(5)安全控制facade类
**
* 安全控制系统facade类
* @author qiang
*
*/
public class SecurityFacade {
private Light light1, light2, light3;
private Camera camera1, camera2;
private Alarm alarm;
private Sensor sensor;
public SecurityFacade(){
light1 = new Light();
light2 = new Light();
light3 = new Light();
camera1 = new Camera();
camera2 = new Camera();
alarm = new Alarm();
sensor = new Sensor();
}
/**
* 启动
*/
public void turnOn(){
light1.turnOn();
light2.turnOn();
light3.turnOn();
camera1.turnOn();
camera2.turnOn();
alarm.activate();
sensor.activate();
}
/**
* 关闭
*/
public void turnOff(){
light1.turnOff();
light2.turnOff();
light3.turnOff();
camera1.turnOff();
camera2.turnOff();
alarm.deactivate();
sensor.deactivate();
}
}
(6)客户端类
/**
* 客户端
* @author qiang
*
*/
public class Client {
public static void main(String[] args) {
SecurityFacade facade = new SecurityFacade();
facade.turnOn();//启动
facade.turnOff();//关闭
}
}
4、总结
1)
根据“单一职责原则”,
在软件中将一个系统划分为若干个子系统有利于降低整个系统的复杂性
,一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小,而达到该目标的途径之一就是
引入一个外观对象
,它
为子系统的访问提供了一个简单而单一的入口
。
2)外观模式也是“迪米特法则”的体现,通过引入一个新的外观类可以降低原有系统的复杂度,外观类充当了客户类与子系统类之间的“第三者”,同时降低客户类与子系统类的耦合度。外观模式就是实现代码重构以便达到“迪米特法则”要求的一个强有力的武器。
4)外观模式从很大程度上
提高了客户端使用的便捷性
,使得客户端无须关心子系统的工作细节,通过外观角色即可调用相关功能。
5)
不要试图通过外观类为子系统增加新行为 ,
不要通过继承一个外观类在子系统中加入新的行为,这种做法是错误的。
外观模式的用意是为子系统提供一个集中化和简化的沟通渠道,而不是向子系统加入新的行为,新的行为的增加应该通过修改原有子系统类或增加新的子系统类来实现,不能通过外观类来实现。