外觀模式
定義
要求一個(gè)子系統(tǒng)的外部與其內(nèi)部的通信必須通過一個(gè)統(tǒng)一的對(duì)象進(jìn)行翎猛。外觀模式提供一個(gè)高層次的接口,使得子系統(tǒng)更易于使用。
通用類圖
通用類圖.png
說明:Facade知曉子系統(tǒng)的所有功能和責(zé)任,外部不用理會(huì)子系統(tǒng)內(nèi)部是怎么實(shí)現(xiàn)泰涂,直接通過它便可以和內(nèi)部進(jìn)行通信。SubSystemClasses可以是一個(gè)或多個(gè)子系統(tǒng)辐怕,每個(gè)子系統(tǒng)是一個(gè)類的集合逼蒙。
通用代碼
// 定義子系統(tǒng)中的類
public class ClassA {
public void methodA() {
// 子系統(tǒng)中A類的業(yè)務(wù)邏輯
}
}
public class ClassB {
public void methodB(){
// 子系統(tǒng)中B類的業(yè)務(wù)邏輯
}
}
public class ClassC {
public void methodC(){
// 子系統(tǒng)中C類的業(yè)務(wù)邏輯
}
}
// 外觀類
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();
}
}
// 客戶端調(diào)用
public class Client {
public static void main(String[] args) {
Facade facade = new Facade();
facade.methodA();
facade.methodB();
facade.methodC();
}
}
樣例展示
一個(gè)保安系統(tǒng)由錄像機(jī)、電燈寄疏、紅外線監(jiān)控和警報(bào)器組成是牢。保安系統(tǒng)的操作人員需要經(jīng)常將這些儀器啟動(dòng)和關(guān)閉。保安類需要用到所有的錄像機(jī)(Camera)陕截、電燈(Light)驳棱、感應(yīng)器(Sensor)和警報(bào)器(Alarm)對(duì)象,保安覺得使用不方便农曲。
分析:子系統(tǒng)包括錄像機(jī)社搅、點(diǎn)燈、感應(yīng)器和警報(bào)器乳规,可以通過一個(gè)門面將這些儀器的操作封裝在一起形葬,保安類就不必自己直接去操控這些對(duì)象,而是通過這個(gè)門面來(lái)操作暮的。
樣例類圖
樣例類圖.png
樣例代碼
// 定義一個(gè)設(shè)備接口
public interface Equipment {
public void turnOn(); // 打開設(shè)備
public void turnOff(); // 關(guān)閉設(shè)備
}
// 具體設(shè)備
public class Camera implements Equipment {
@Override
public void turnOn() {
System.out.println("打開錄像機(jī)");
}
@Override
public void turnOff() {
System.out.println("關(guān)閉錄像機(jī)");
}
}
public class Light implements Equipment {
@Override
public void turnOn() {
System.out.println("打開電燈");
}
@Override
public void turnOff() {
System.out.println("關(guān)閉電燈");
}
}
public class Sensor implements Equipment {
@Override
public void turnOn() {
System.out.println("打開傳感器");
}
@Override
public void turnOff() {
System.out.println("關(guān)閉傳感器");
}
}
public class Alarm implements Equipment {
@Override
public void turnOn() {
System.out.println("打開警報(bào)器");
}
@Override
public void turnOff() {
System.out.println("關(guān)閉警報(bào)器");
}
}
// 定義一個(gè)門面(外觀)笙以,也就是控制臺(tái)
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();
}
// …… 后面的設(shè)備就不寫了
}
// 最后是保安類通過控制臺(tái)調(diào)用
public class Police {
public static void main(String[] args) {
Console console = new Console();
console.turnOnAll();
console.turnOffCamera();
}
}
本文為《設(shè)計(jì)模式之禪》讀后筆記總結(jié)