外觀模式(Facade Pattern)
阿新 • • 發佈:2017-12-18
源代碼 任務 減少 系統 移植 computer uml類圖 auto 完成 定義:
定義了一個高層、統一的接口,外部與通過這個統一的接口對子系統中的一群接口進行訪問。
解決的問題:
因為編譯一個子系統一般不需要編譯所有其他的子系統。一個子系統的修改對其他子系統沒有任何影響,而且子系統內部變化也不會影響到外觀對象。
缺點:
- 避免了系統與系統之間的高耦合度
- 使得復雜的子系統用法變得簡單
uml類圖:
模式組成:
- Facade:外觀角色。是模式的核心,他被客戶client角色調用,知道各個子系統的功能。同時根據客戶角色已有的需求預訂了幾種功能組成
- Subsystem classes:子系統角色。實現子系統的功能,並處理由Facade對象指派的任務。對子系統而言,facade和client角色是未知的,沒有Facade的任何相關信息;即沒有指向Facade的實例
- client:客戶角色
- 降低了客戶類與子系統類的耦合度,實現了子系統與客戶之間的松耦合關系
- 只是提供了一個訪問子系統的統一入口,並不影響用戶直接使用子系統類
- 減少了與子系統的關聯對象,實現了子系統與客戶之間的松耦合關系,松耦合使得子系統的組件變化不會影響到它的客戶。
- 外觀模式對客戶屏蔽了子系統組件,從而簡化了接口,減少了客戶處理的對象數目並使子系統的使用更加簡單。
- 引入外觀角色之後,用戶只需要與外觀角色交互;
- 用戶與子系統之間的復雜邏輯關系由外觀角色來實現
- 降低原有系統的復雜度和系統中的編譯依賴性,並簡化了系統在不同平臺之間的移植過程
- 在不引入抽象外觀類的情況下,增加新的子系統可能需要修改外觀類或客戶端的源代碼,違背了“開閉原則”
- 不能很好地限制客戶使用子系統類,如果對客戶訪問子系統類做太多的限制則減少了可變性和靈活性。
class Computer { Memory memory; Cpu cpu; public Computer() { memory = new Memory(); cpu= new Cpu(); } public void start() { memory.start(); cpu.start(); } }
定義子系統角色
class Memory { public void start() { System.out.println("memory start!"); } }
定義子系統角色
class Cpu { public void start() { System.out.println("cpu start!"); } }
客戶端調用
public static void main(String[] args) { Computer c = new Computer(); c.start(); }
外觀模式(Facade Pattern)