1. 程式人生 > >外觀模式(Facade Pattern)

外觀模式(Facade Pattern)

源代碼 任務 減少 系統 移植 computer uml類圖 auto 完成

定義: 定義了一個高層、統一的接口,外部與通過這個統一的接口對子系統中的一群接口進行訪問。 解決的問題:
  • 避免了系統與系統之間的高耦合度
  • 使得復雜的子系統用法變得簡單

uml類圖:

技術分享圖片

模式組成:
  • Facade:外觀角色。是模式的核心,他被客戶client角色調用,知道各個子系統的功能。同時根據客戶角色已有的需求預訂了幾種功能組成
  • Subsystem classes:子系統角色。實現子系統的功能,並處理由Facade對象指派的任務。對子系統而言,facade和client角色是未知的,沒有Facade的任何相關信息;即沒有指向Facade的實例
  • client:客戶角色
    。調用facade角色獲得完成相應的功能
優點:
  • 降低了客戶類與子系統類的耦合度,實現了子系統與客戶之間的松耦合關系
    1. 只是提供了一個訪問子系統的統一入口,並不影響用戶直接使用子系統類
    2. 減少了與子系統的關聯對象,實現了子系統與客戶之間的松耦合關系,松耦合使得子系統的組件變化不會影響到它的客戶。
  • 外觀模式對客戶屏蔽了子系統組件,從而簡化了接口,減少了客戶處理的對象數目並使子系統的使用更加簡單
    1. 引入外觀角色之後,用戶只需要與外觀角色交互;
    2. 用戶與子系統之間的復雜邏輯關系由外觀角色來實現
  • 降低原有系統的復雜度和系統中的編譯依賴性,並簡化了系統在不同平臺之間的移植過程
因為編譯一個子系統一般不需要編譯所有其他的子系統。一個子系統的修改對其他子系統沒有任何影響,而且子系統內部變化也不會影響到外觀對象。 缺點:
  • 在不引入抽象外觀類的情況下,增加新的子系統可能需要修改外觀類或客戶端的源代碼,違背了“開閉原則”
  • 不能很好地限制客戶使用子系統類,如果對客戶訪問子系統類做太多的限制則減少了可變性和靈活性。
應用: 舉個栗子: 定義外觀角色
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)