外观模式(Facade),又称为门面模式,是一种比较简单又非常常用的设计模式
目录
模式定义
为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
类图
参与者
Facade门面角色
客户端可以调用这个角色的方法。此角色知晓子系统的所有功能和责任。一般情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去,也就说该角色没有实际的业务逻辑,只是一个委托类。
subsystem
子系统角色可以同时有一个或者多个子系统。每一个子系统都不是一个单独的类,而是一个类的集合。子系统并不知道门面的存在。对于子系统而言,门面仅仅是另外一个客户端而已。
例子
一个保安系统的,由录像机、电灯、红外线监控和警报器组成。保安系统的操作人员需要经常将这些仪器启动和关闭。保安类需要用到所有的录像机(Camera)、电灯(Light)、感应器(Sensor)和警报器(Alarm)对象,保安觉得使用不方便。应用外观模式,用控制台应用程序改进该设计。绘制该模式的UML图。
//定义一个设备接口
public interface Equipment {
public void turnOn(); // 打开设备
public void turnOff(); // 关闭设备
}
public class Camera implements Equipment {
public void turnOn() {
System.out.println("打开录像机");
}
public void turnOff() {
System.out.println("关闭录像机");
}
}
public class Light implements Equipment {
public void turnOn() {
System.out.println("打开电灯");
}
public void turnOff() {
System.out.println("关闭电灯");
}
}
public class Sensor implements Equipment {
@Override
public void turnOn() {
System.out.println("打开传感器");
}
@Override
public void turnOff() {
System.out.println("关闭传感器");
}
}
public class Alarm implements Equipment {
@Override
public void turnOn() {
System.out.println("打开警报器");
}
@Override
public void turnOff() {
System.out.println("关闭警报器");
}
}
public class Console {
private Equipment camera = new Camera();
private Equipment light = new Light();
private Equipment sensor = new Sensor();
private Equipment alarm = new Alarm();
public void turnOnAll() {
camera.turnOn();
light.turnOn();
sensor.turnOn();
alarm.turnOn();
}
public void turnOffAll() {
camera.turnOff();
light.turnOff();
sensor.turnOff();
alarm.turnOff();
}
}
public class Cline {
public static void main(String[] args) {
Console console = new Console();
console.turnOnAll();
console.turnOffAll();
}
}
通过一个Console的门面类,控制子系统的功能