設計模式(九)外觀模式

版權聲明:轉載必須註明本文轉自曉_晨的博客:http://blog.csdn.net/niunai112

目錄

導航

設計模式之六大設計原則
設計模式(一)單例模式
設計模式(二)工廠模式
設計模式(三)策略模式
設計模式(四)適配器模式
設計模式(五)享元模式
設計模式(六)建造者模式
設計模式(七)原型模式
設計模式(八)橋接模式
設計模式(九)外觀模式
設計模式(十)組合模式
設計模式(十一)裝飾器模式
設計模式(十二)代理模式
設計模式(十三)迭代器模式
設計模式(十四)觀察者模式
設計模式(十五)中介者模式
設計模式(十六)命令模式
設計模式(十七)狀態模式
設計模式(十八)訪問者模式
設計模式(十九)責任鏈模式
設計模式(二十)解釋器模式
設計模式(二十一)備忘錄模式
設計模式(二十二)模板模式
設計模式總結篇(爲什麼要學習設計模式,學習設計模式的好處)

前言

外觀模式又叫門面模式,在java中應用十分廣泛,比如web開發中前端和後端的交互就是外觀模式,前端只需要知道使用這個接口會產生什麼樣的結果,比如調用insertUser,會在數據庫中插入一條數據,但是後臺是怎麼做的,前端完全不需要管,也不需要去管。

例子

LZ覺得電腦這個例子來講外觀模式是非常好的,電腦內部非常複雜,假如沒有外觀類,那麼和用戶類的耦合度降非常高,拿用戶打開電腦和關閉電腦爲例,假如沒有外觀模式的話,用戶直接面對的是CPU,內存和硬盤,各種複雜的操作和邏輯,假如真的如此的話,那麼會使用的電腦的人將變得很少,很少有人會有這麼專業的知識。
但是當我們使用了外觀模式後,用戶只需要按一個按鈕,開機鍵,關機只需要點一下關機的按鈕就可以了。這讓用戶與大量複雜的東西解耦開了,對於用戶來說,他不用關心按了開機鍵後到底發生了什麼,然後他確實也不需要關心,他只知道按了開機鍵後,電腦打開了,這就足夠了。
用java來實現如下:


/***
 *
 *@Author ChenjunWang
 *@Description:Cpu類
 *@Date: Created in 17:19 2018/3/26
 *@Modified By:
 *
 */
public class Cpu {

    public void execute() {
        System.out.println("CPU 開始執行");
    }

    public void colse(){
        System.out.println("斷開CPU電源");
    }
}
/***
 *
 *@Author ChenjunWang
 *@Description:磁盤類
 *@Date: Created in 17:19 2018/3/26
 *@Modified By:
 *
 */
public class Disk {
    public void read() {
        System.out.println("磁盤開始讀取數據……");
    }
    public void write() {
        System.out.println("磁盤開始寫入數據……");
    }
    public void colse(){
        System.out.println("斷開磁盤電源");
    }
}

/***
 *
 *@Author ChenjunWang
 *@Description:內存類
 *@Date: Created in 17:20 2018/3/26
 *@Modified By:
 *
 */
public class Memory {
    public void write() {
        System.out.println("寫入內存……");
    }
    public void read() {
        System.out.println("讀取內存……");
    }
    public void colse(){
        System.out.println("斷開內存電源");
    }
}

/***
 *
 *@Author ChenjunWang
 *@Description:電腦外觀類(封裝操作)
 *@Date: Created in 23:57 2018/3/25
 *@Modified By:
 *
 */
public class ComputerFacade {
    private Cpu cpu;
    private Disk disk;
    private Memory memory;
    public ComputerFacade(){
        this.cpu = new Cpu();
        this.disk = new Disk();
        this.memory = new Memory();
    }
    //開機方法,開機的一系列流程都在這個方法體裏,最終電腦開機完成
    public void startComputer(){
        cpu.execute();
        disk.read();
        memory.write();
        System.out.println("一堆複雜操作…………");
        System.out.println("啓動完成!");

    }
    //關機方法,關機的一系列流程都在這個方法體裏,最終電腦關機完成
    public void closeComputer(){
        System.out.println("一堆複雜操作…………");
        disk.colse();
        memory.colse();
        cpu.colse();
        System.out.println("關閉完成!");

    }
}
/***
 *
 *@Author ChenjunWang
 *@Description:用戶類
 *@Date: Created in 17:31 2018/3/26
 *@Modified By:
 *
 */
public class User {
    public static void main(String[] args) {
        ComputerFacade computerFacade = new ComputerFacade();


        System.out.println("----------------開機----------------");
        computerFacade.startComputer();
        System.out.println("----------------關機----------------");
        computerFacade.closeComputer();
    }
}

運行結果如下
--------------------------------------------
----------------開機----------------
CPU 開始執行
磁盤開始讀取數據……
寫入內存……
一堆複雜操作…………
啓動完成!
----------------關機----------------
一堆複雜操作…………
斷開磁盤電源
斷開內存電源
斷開CPU電源
關閉完成!

本例UML圖
facade

當使用了外觀模式後,對象間的耦合度大大降低,大大方便了使用者使用功能,用戶不需要再和複雜的硬件打交道啦!

總結

優點

(1)最重要的有點是,降低了用戶類與電腦類的耦合度,實現鬆耦合關係
(2)減少了用戶處理的對象數目,並使子系統的使用更加簡單。
(3)用戶與子系統之間的複雜邏輯關係由外觀角色來實現

缺點

(1)在不引入抽象外觀類的情況下,增加新的子系統可能需要修改外觀類或客戶端的源代碼,違背了“開閉原則”
(2)不能很好地限制客戶使用子系統類,如果對客戶訪問子系統類做太多的限制則減少了可變性和靈活性。

Git地址

本篇實例Github地址:https://github.com/stackisok/Design-Pattern/tree/master/src/facade

回到最上方


有什麼不懂或者不對的地方,歡迎留言。
喜歡LZ文章的小夥伴們,可以關注一波,也可以留言,LZ會回你們的。
覺得寫得不錯的小夥伴,歡迎轉載,但請附上原文地址,謝謝^_^!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章