外观模式
定义
要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。外观模式提供一个高层次的接口,使得子系统更易于使用。
通用类图
说明:Facade知晓子系统的所有功能和责任,外部不用理会子系统内部是怎么实现,直接通过它便可以和内部进行通信。SubSystemClasses可以是一个或多个子系统,每个子系统是一个类的集合。
通用代码
// 定义子系统中的类
public class ClassA {
public void methodA() {
// 子系统中A类的业务逻辑
}
}
public class ClassB {
public void methodB(){
// 子系统中B类的业务逻辑
}
}
public class ClassC {
public void methodC(){
// 子系统中C类的业务逻辑
}
}
// 外观类
public class Facade {
private ClassA a = new ClassA();
private ClassB b = new ClassB();
private ClassC c = new ClassC();
public void methodA() {
a.methodA();
}
public void methodB() {
b.methodB();
}
public void methodC() {
c.methodC();
}
}
// 客户端调用
public class Client {
public static void main(String[] args) {
Facade facade = new Facade();
facade.methodA();
facade.methodB();
facade.methodC();
}
}
样例展示
一个保安系统由录像机、电灯、红外线监控和警报器组成。保安系统的操作人员需要经常将这些仪器启动和关闭。保安类需要用到所有的录像机(Camera)、电灯(Light)、感应器(Sensor)和警报器(Alarm)对象,保安觉得使用不方便。
分析:子系统包括录像机、点灯、感应器和警报器,可以通过一个门面将这些仪器的操作封装在一起,保安类就不必自己直接去操控这些对象,而是通过这个门面来操作。
样例类图
样例代码
// 定义一个设备接口
public interface Equipment {
public void turnOn(); // 打开设备
public void turnOff(); // 关闭设备
}
// 具体设备
public class Camera implements Equipment {
@Override
public void turnOn() {
System.out.println("打开录像机");
}
@Override
public void turnOff() {
System.out.println("关闭录像机");
}
}
public class Light implements Equipment {
@Override
public void turnOn() {
System.out.println("打开电灯");
}
@Override
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 void turnOnCamera() {
camera.turnOn();
}
public void turnOffCamera() {
camera.turnOff();
}
// …… 后面的设备就不写了
}
// 最后是保安类通过控制台调用
public class Police {
public static void main(String[] args) {
Console console = new Console();
console.turnOnAll();
console.turnOffCamera();
}
}
本文为《设计模式之禅》读后笔记总结