外觀模式
今天我們講解的是23種設計模式中的第十種——外觀模式。外觀模式主要通過向現有的系統添加一個接口,來隱藏系統的複雜性。
概念:
外觀模式是一種通過爲多個複雜的子系統提供一個一致的接口,而使這些子系統更加容易被訪問的模式。該模式對外有一個統一接口,外部應用程序不用關心內部子系統的具體的細節,這樣會大大降低應用程序的複雜度,提高了程序的可維護性。
特點:
優點:
-
降低了子系統與客戶端之間的耦合度,使得子系統的變化不會影響調用它的客戶類。
-
對客戶屏蔽了子系統組件,減少了客戶處理的對象數目,並使得子系統使用起來更加容易。
-
降低了大型軟件系統中的編譯依賴性,簡化了系統在不同平臺之間的移植過程,因爲編譯一個子系統不會影響其他的子系統,也不會影響外觀對象。
缺點:
- 增加新的子系統可能需要修改外觀類或客戶端的源代碼,違背了“開閉原則”。
類圖分析:
代碼:
影院燈光
package cn.ppdxzz.facade;
/**
* Description:影院燈光
* @Author: PeiChen JavaAnything
*/
public class TheaterLight {
private static final TheaterLight INSTANCE = new TheaterLight();
public static TheaterLight getInstance() {
return INSTANCE;
}
public void on() {
System.out.println("燈光開啓");
}
public void off() {
System.out.println("燈光關閉");
}
public void dim() {
System.out.println("燈光變暗...");
}
public void bright() {
System.out.println("燈光變亮...");
}
}
爆米花
package cn.ppdxzz.facade;
/**
* Description:爆米花
* @Author: PeiChen JavaAnything
*/
public class Popcorn {
private static final Popcorn INSTANCE = new Popcorn();
public static Popcorn getInstance() {
return INSTANCE;
}
public void on() {
System.out.println("爆米花開始");
}
public void off() {
System.out.println("爆米花結束");
}
public void pop() {
System.out.println("正在爆爆米花...");
}
}
屏幕
package cn.ppdxzz.facade;
/**
* Description:屏幕
* @Author: PeiChen JavaAnything
*/
public class Screen {
private static final Screen INSTANCE = new Screen();
public static Screen getInstance() {
return INSTANCE;
}
public void up() {
System.out.println("屏幕上拉");
}
public void down() {
System.out.println("屏幕下拉");
}
}
投影儀
package cn.ppdxzz.facade;
/**
* Description:投影儀
* @Author: PeiChen JavaAnything
*/
public class Projector {
private static final Projector INSTANCE = new Projector();
public static Projector getInstance() {
return INSTANCE;
}
public void on() {
System.out.println("投影儀開啓");
}
public void off() {
System.out.println("投影儀關閉");
}
public void focus() {
System.out.println("投影儀正在投影...");
}
}
立體聲
package cn.ppdxzz.facade;
/**
* Description:立體聲
* @Author: PeiChen JavaAnything
*/
public class Stereo {
private static final Stereo INSTANCE = new Stereo();
public static Stereo getInstance() {
return INSTANCE;
}
public void on() {
System.out.println("立體聲開啓");
}
public void off() {
System.out.println("立體聲關閉");
}
}
客戶端
package cn.ppdxzz.facade;
/**
* Description:外觀模式家庭電影院
* @Author: PeiChen JavaAnything
*/
public class Client {
public static void main(String[] args) {
HomeTheater homeTheater = new HomeTheater();
homeTheater.ready();
homeTheater.play();
homeTheater.pauseIng();
homeTheater.end();
}
}
運行演示:
總結:
- 外觀模式對外屏蔽了子系統的細節,因此外觀模式降低了客戶端對子系統使用的複雜性。
- 當系統需要進行分層設計時,可以考慮使用 Facade 模式。
Java 體系的三層開發模式就是使用的這種外觀模式的思想,這種設計模式還是非常有必要學習一下它的思想的。