25.外觀模式

基本介紹

1)外觀模式(Facade,也叫“過程模式:外觀模式為子系統中的一組接口提供一個一致的界面,此模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。
2)外觀模式通過定義一個一致的接口,用以屏蔽內部子系統的細節,使得調用端只需跟這個接口發生調用,而無需關心這個子系統的內部細節。


外觀模式類圖

原理類圖的說明(外觀模式的角色)

1)外觀類(Facade):為調用端提供統一的調用接口,外觀類知道哪些子系統負責處理請求,從而將調用端的請求代理給適當子系統對象。
2)調用者(Client):外觀接口的調用者。
3)子系統的集合:指模塊或者子系統,處理Facade對象指派的任務,他是功能的實際提供。

外觀模式的注意事項和細節

1)外觀模式對外屏蔽了子系統的細節,因此外觀模式降低了客戶端對子系統使用的復雜性。
2)外觀模式對客戶端與子系統的耦合關系,讓子系統內部的模塊更易維護和擴展。
3)通過合理的使用外觀模式,可以幫我們更好的劃分訪問的層次。
4)當系統需要進行分層設計時,可以考慮使用Facade模式。
5)在維護一個遺留的大型系統時,可能這個系統已經變得非常難以維護和擴展,此時可以考慮為新系統開發一個Facade類,來提供遺留系統的比較清晰簡單的接口,讓新系統與Facade類交互,提高復用性。
6)不能過多的或者不合理的使用外觀模式,使用外觀模式好,還是直接調用模塊好。要以讓系統有層次,利于維護為目的。

UML

外觀模式UML

代碼實現

客戶端 FacadeTest

package com.yuan.dp.facade;

public class FacadeTest {
    public static void main(String[] args) throws InterruptedException {
        遙控器 remoteControl = new 遙控器();
        remoteControl.ready("十樓一號");
        System.out.println();
        System.out.println();
        System.out.println();
        Thread.sleep(1000 * 2);
        System.out.println(
                "開始開會.........."
        );
        System.out.println();
        System.out.println();
        System.out.println();
        Thread.sleep(1000 * 5);
        remoteControl.over("十樓一號");
    }
}

外觀類 遙控器

package com.yuan.dp.facade;

/**
 * 外觀類_遙控器 RemoteControl
 * 在 一次用到很多類的方法是采取考慮使用外觀模式
 */
public class 遙控器 {
    擴音器 loudspeaker;
    投影儀 Projector;
    燈 lamp;
    窗簾 windowCurtains;
    麥克風 microphone;

    public 遙控器() {
        loudspeaker = new 擴音器();
        Projector = new 投影儀();
        lamp = new 燈();
        windowCurtains = new 窗簾();
        microphone = new 麥克風();
    }

    void ready(String address) {
        System.out.println(address + "會場 會議準備.............");
        windowCurtains.on();
        lamp.off();
        Projector.on();
        microphone.on();
        loudspeaker.on();

    }

    void over(String address) {
        System.out.println(address + "會場 會議結束.............");
        windowCurtains.off();
        lamp.on();
        Projector.off();
        microphone.off();
        loudspeaker.off();
    }

}

子系統類 (窗簾、投影儀、擴音器、燈、麥克風)

package com.yuan.dp.facade;

/**
 * 被裝飾類_窗簾 WindowCurtains
 */
public class 窗簾 {
    /**
     * 窗簾拉上
     */
    void on() {
        System.out.println("窗簾拉上.....");
    }

    /**
     * 窗簾拉開
     */
    void off() {
        System.out.println("窗簾拉開.....");
    }
}

/**
 * 被裝飾類_燈 lamp
 */
class 燈 {
    /**
     * 打開照明
     */
    void on() {
        System.out.println("打開照明.....");
    }

    /**
     * 關閉照明
     */
    void off() {
        System.out.println("關閉照明.....");
    }
}


/**
 * 被裝飾類_投影儀 Projector
 */
class 投影儀 {
    /**
     * 投影儀開啟
     */
    void on() {
        System.out.println("投影儀開啟.....");
    }

    /**
     * 投影儀關閉
     */
    void off() {
        System.out.println("投影儀關閉.....");
    }
}


/**
 * 被裝飾類_麥克風 Microphone
 */
class 麥克風 {
    /**
     * 麥克風開啟
     */
    void on() {
        System.out.println("麥克風開啟.....");
    }

    /**
     * 麥克風關閉
     */
    void off() {
        System.out.println("麥克風關閉.....");
    }
}


/**
 * 被裝飾類_擴音器 Loudspeaker
 */
class 擴音器 {
    /**
     * 擴音器開啟
     */
    void on() {
        System.out.println("擴音器開啟.....");
    }

    /**
     * 擴音器關閉
     */
    void off() {
        System.out.println("擴音器關閉.....");
    }
}
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容