設計模式之適配器模式與外觀模式(二)

好了,經過上次的學習,咱們已經知道適配器模式是如何將一個類的接口轉換成另外一個符合客戶指望的接口。同時也知道在Java中要作到這一點,必須將一個不兼容接口的對象包裝起來,變成兼容的對象。java

咱們如今要看一個改變接口的新模式,可是它改變接口的緣由是爲了簡化接口。這個模式被巧妙地命名爲外觀模式(Facade-Pattern),之因此這麼稱呼,是由於它將一個或數個類的複雜的一切都隱藏在背後,只顯露出一個乾淨美好的外觀。編程

繁瑣的看電影步驟

還記得咱們以前說過的命令模式中,一個遙控器能控制不少家電的過程吧。簡單的開關咱們都會,複雜的模式,就比較麻煩,好比看電影的步驟:ide

  1. 打開爆米花機
  2. 開始爆米花
  3. 將燈光調暗
  4. 放下屏幕
  5. 打開投影機
  6. 將投影機的輸入切換到DVD
  7. 將投影機設置在寬屏模式
  8. 打開功放
  9. 將功放的輸入設置爲DVD
  10. 將攻放設置爲環繞立體聲
  11. 將攻放音量調到中
  12. 打開DVD播放器
  13. 開始播放DVD

看一個電影,真的是如此繁瑣。並且看完電影以後,還得過去把這些步驟都關閉。是用你的家庭影院居然變得如此複雜!讓咱們看看外觀模式如何解決這團混亂,好讓你輕鬆享受。工具

燈光、相機、外觀!

你須要的正是一個外觀:有了外觀模式,經過實現一個提供更合理的接口的外觀類,你能夠將一個複雜的子系統變得容易使用。學習

  1. 咱們爲家庭影院系統建立一個外觀,命名爲HomeTheaterFacade,它對外暴露出幾個簡單的方法,例如watchMovie()
  2. 這個外觀類將家庭影院諸多組件視爲一個子系統,經過調用這個子系統,來實現watchMovie()方法
  3. 如今,你的客戶代碼能夠調用此家庭影院外觀所提供的方法,而沒必要再調用這個子系統的方法。
  4. 外觀只是提供你更直接的操做,並未將原來的子系統阻隔起來。若是你須要子系統類的更高層的功能呢,仍是可使用原來的子系統的

構造家庭影院外觀

好了,那接下來就到實戰階段啦。this

第一步是使用組合讓外觀可以訪問子系統中全部的組件設計

public class HomeTheaterFacade {
    Amplifier amp;
    Tuner tuner;
    DvdPlayer dvd;
    CdPlayer cd;
    Projector projector;
    TheaterLights lights;
    Screen screen;
    PopcornPopper popper;
 
    public HomeTheaterFacade(Amplifier amp, 
                 Tuner tuner, 
                 DvdPlayer dvd, 
                 CdPlayer cd, 
                 Projector projector, 
                 Screen screen,
                 TheaterLights lights,
                 PopcornPopper popper) {
 
        this.amp = amp;
        this.tuner = tuner;
        this.dvd = dvd;
        this.cd = cd;
        this.projector = projector;
        this.screen = screen;
        this.lights = lights;
        this.popper = popper;
    }
 
    // 將咱們以前手動進行的每項任務依次處理。這裏每項任務都是委託子系統中相應的組件處理的
    public void watchMovie(String movie) {
        System.out.println("Get ready to watch a movie...");
        popper.on();
        popper.pop();
        lights.dim(10);
        screen.down();
        projector.on();
        projector.wideScreenMode();
        amp.on();
        amp.setDvd(dvd);
        amp.setSurroundSound();
        amp.setVolume(5);
        dvd.on();
        dvd.play(movie);
    }
 
 
    public void endMovie() {
        System.out.println("Shutting movie theater down...");
        popper.off();
        lights.on();
        screen.up();
        projector.off();
        amp.off();
        dvd.stop();
        dvd.eject();
        dvd.off();
    }
}

有了這個基礎,後面觀賞電影就變得簡單了。code

public class HomeTheaterTestDrive {
    public static void main(String[] args) {
        Amplifier amp = new Amplifier("Top-O-Line Amplifier");
        Tuner tuner = new Tuner("Top-O-Line AM/FM Tuner", amp);
        DvdPlayer dvd = new DvdPlayer("Top-O-Line DVD Player", amp);
        CdPlayer cd = new CdPlayer("Top-O-Line CD Player", amp);
        Projector projector = new Projector("Top-O-Line Projector", dvd);
        TheaterLights lights = new TheaterLights("Theater Ceiling Lights");
        Screen screen = new Screen("Theater Screen");
        PopcornPopper popper = new PopcornPopper("Popcorn Popper");
 
        // 根據子系統全部的組件來實例化外觀
        HomeTheaterFacade homeTheater = 
                new HomeTheaterFacade(amp, tuner, dvd, cd, 
                        projector, screen, lights, popper);
 
        // 使用簡化的接口,並開啓電影,而後關閉電影
        homeTheater.watchMovie("Raiders of the Lost Ark");
        homeTheater.endMovie();
    }
}

就這樣,咱們完成了外觀模式的處理。當你使用完,是否是以爲很簡單了呢。對象

定義外觀模式

想要用外觀模式,咱們建立了一個接口簡化而統一的類,用來包裝子系統中一個或多個複雜的類。外觀模式至關直接,很容易理解,這方面和許多其餘的模式不太同樣。但這並不會下降它的威力:外觀模式容許咱們讓客戶和子系統之間避免緊耦合。並且外觀模式也幫咱們遵循一個新的面向對象原則。繼承

外觀模式提供了一個統一的接口,用來訪問子系統中的一羣接口。外觀定義了一個高層接口,讓子系統更容易使用。

最少知識原則:只和你的密友談話。這個原則系統咱們在設計中,不要讓太多的類耦合在一塊兒,省得修改系統中的一部分,會影響到其餘部分。若是許多類之間相互依賴,那麼這個系統就會變成一個易碎的系統,他須要花許多成本維護,也會由於太複雜而不容易被其餘人瞭解。

咱們來作一個對比你們就知道啦

// 不採用這個原則,咱們須要調用兩次方法才能獲取到最終的信息
public float getTemp() {
    Thermometer thermometer = station.getThermometer();
    return thermometer.getTemperature();
}

// 採用這個原則,咱們加進一個方法,這樣就能夠減小咱們所依賴的類的數目
public float getTemp() {
    return station.getTemperature();
}

設計箱內的工具

由於此次學習的內容比較簡單,我就在這篇裏進行總結了。

  • OO基礎

    抽象、封裝、繼承、多態

  • OO原則

    封裝變化

    多用組合,少用繼承

    針對接口編程,不針對實現編程

    爲交互對象之間的鬆耦合設計而努力

    依賴抽象,不要依賴具體類

    類應該對擴展開放,對修改關閉

    只和朋友交談

  • OO模式

    『策略模式』、『觀察者模式』、『裝飾者模式』、『抽象工廠模式』、『工廠方法模式』、『單例模式』、『命令模式』

    適配器模式』將一個類的接口,轉換成客戶指望另外一個接口。適配器讓本來不兼容的類合做無間。

    外觀模式』提供了一個統一的接口,用來訪問子系統中的一羣接口。外觀定義了一個高層接口,讓子系統更容易使用。

此次學習的適配器和外觀,雖然篇幅很少,可是在日常寫代碼的過程當中仍是常用的,尤爲是適配器模式,大家以爲呢?因此,這一塊還得鞏固好,這樣對於後面編寫代碼,理解代碼的根源頗有幫助的哦。下次,咱們開啓模板方式模式之旅。

PS:小編在介紹適配器模式的時候,只舉例說明了對象適配器。其實還有一個類適配器,可是那個是須要用到多重繼承的,考慮到Java沒有實際場景,這裏就略過了。感興趣的朋友能夠繼續深刻研究下。

愛生活,愛學習,愛感悟,愛挨踢

相關文章
相關標籤/搜索