1. 程式人生 > >java23種設計模式-門面(外觀)模式

java23種設計模式-門面(外觀)模式

定義

外觀模式為子系統的一組介面提供一個一致的介面,此模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。

UML

角色

  • 子系統(SubSystem): 表示一個系統的子系統或者模組
  • 門面(Facade): 客戶端通過門面間接控制子系統。門面遮蔽了客戶端無需知道的細節,簡化了呼叫過程。

示例

我們使用的電腦的使用者桌面便是一個很好的例子。桌面充當門面角色,使用者使用的各應用可以看作子系統的不同組成部分。

/**
 * desc : qq
 * Created by tiantian on 2018/10/6
 */
public class QQ {
    public void init() {
        System.out.println("QQ is initing.");
    }
    
    public void startUp() {
        init();
        run();
    }
    
    public void run() {
        System.out.println("QQ is runing.");
    }
    
    public void quit() {
        System.out.println("QQ is shutdown.");
    }
}
/**
 * desc : 音樂播放器
 * Created by tiantian on 2018/10/6
 */
public class Itunes {
    public void init() {
        System.out.println("Itunes is initing.");
    }

    public void startUp() {
        init();
        run();
    }

    public void run() {
        System.out.println("Itunes is playing music.");
    }

    public void quit() {
        System.out.println("Itunes is shutdown.");
    }
}

/**
 * desc : 瀏覽器
 * Created by tiantian on 2018/10/6
 */
public class IE {
    public void init() {
        System.out.println("IE is initing.");
    }

    public void startUp() {
        init();
        run();
    }

    public void run() {
        System.out.println("IE is runing.");
    }

    public void quit() {
        System.out.println("IE is shutdown.");
    }
}

/**
 * desc : 電腦桌面(系統的門面)
 * Created by tiantian on 2018/10/6
 */
public class Desktop {
    private QQ qq = new QQ();
    private Itunes itunes = new Itunes();
    private IE ie = new IE();
    
    public void startUpQQ() {
        qq.startUp();
    }
    
    public void quitQQ() {
        qq.quit();
    }
    
    public void startUpItunes() {
        itunes.startUp();
    }
    
    public void quitItunes() {
        itunes.quit();
    }

    public void startUpIe() {
        ie.startUp();
    }

    public void quitIe() {
        ie.quit();
    }
    
}

總結

門面模式的好處很多,首先客戶端不用直接依賴子系統各模組,而是通過門面角色發生關聯,鬆散了兩者之間的耦合,同時也符合迪米特原則。其次,對於客戶端來說使用非常便捷。缺點也很明顯,不符合開閉原則,如果子系統增加了模組,則不得不更改門面類。