1. 程式人生 > >設計模式(八)—— 外觀模式

設計模式(八)—— 外觀模式

一、含義

提供一個統一的介面,用來訪問子系統中的一群介面。外觀定義了一個高層介面,讓子系統更容易使用。也就是當客戶需要呼叫程式多個介面完成一件事情時,那麼就可以多個介面呼叫的方法,封裝在一個接口裡提供給客戶使用。

二、要點

1.當需要簡化並同意一個很大的介面或者一群複雜的介面時,使用外觀模式。

2.外觀模式將客戶從一個複雜的子系統中解耦。

3.實現一個外觀模式,需要將子系統組合進外觀中,然後將工作委託給子系統執行。

三、實戰分析外觀模式

首先來看一下外觀模式的類圖:

當週末來的時候,一個在家看一場電影,是非常爽的一件事,現在努力敲程式碼就是為了,可以在搞一個私人小影院,簡直不要太爽,現在可以先來定製一個看電影的流程:開啟爆米花機(看電影不吃點什麼,感覺浪費了看電影的時間)——開始爆米花——將房間燈光調暗——放下螢幕——開啟投影機——將投影機設定好投影模式——開啟功放——將功放的輸入設定為DVD——將功放設定為環繞立體聲——將功放的音量調到適中——開啟DVD播放器——開始播放DVD。程式碼演示如下:


    //開啟爆米花機
    popper.on();
    popper.pop();

    //調暗燈光
    lights.dim(10);

    //放下螢幕
    screen.down();

    //開啟投影機
    projector.on();
    projector.setInput(dvd);
    projector.wideScreenMode();

    //設定功放
    amp.on();
    amp.setDvd(dvd);
    amp.setSurroundSound();
    amp.setVolume(5);

    //開啟DVD
    dvd.on();
    dvd.play(movie);

看一場電影要涉及到這麼多的類,對我來說看個電影真不容易!那有沒有方法可以簡化這些麻煩的操作呢,要是有一鍵操作就好了,我只需要一個遙控器,按一下,就可以播放電影,這個時候,就可以使用外觀模式了:

public class TheaterFacadeControl {
    Amplifier amp;
    Tuner tuner;
    DvdPlayer dvdPlayer;
    CdPlayer cdPlayer;
    Projector projector;
    TheaterLights lights;
    Screen screen;
    PopcornPopper popper;

    public TheaterFacadeControl(Amplifier amp,
                                Tuner tuner,
                                DvdPlayer dvdPlayer,
                                CdPlayer cdPlayer,
                                Projector projector,
                                TheaterLights lights,
                                Screen screen,
                                PopcornPopper popper) {
        this.amp = amp;
        this.tuner = tuner;
        this.dvdPlayer = dvdPlayer;
        this.cdPlayer = cdPlayer;
        this.projector = projector;
        this.lights = lights;
        this.screen = screen;
        this.popper = popper;
    }
    //只需遙控器按一下,我就可以看電影了,美滋滋
    public void watchMovie(String 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 class Test2 {


    public static void main(String[] args) {
        //例項化元件
        Amplifier amp = new Amplifier();
        Tuner tuner = new Tuner();
        DvdPlayer dvd = new DvdPlayer();
        Projector projector = new Projector();
        TheaterLights lights = new TheaterLights();
        Screen screen = new Screen();
        PopcornPopper popper = new PopcornPopper();

        TheaterFacadeControl theater = new TheaterFacadeControl(amp,tuner,dvd,projector,lights,screen,popper);
        //使用簡化後的遙控器看電影
        theater.watchMovie("喜劇之王");
    }
}

測試結果如下:

PopcornPopper on
PopcornPopper pop
TheaterLights dim10
Screen down
Projector on
Projector wideScreenMode
Amplifier on
Amplifier setDvd
Amplifier setSurroundSound
Amplifier setVolume 5
DvdPlayer on
DvdPlayer play喜劇之王

以後看電影就方便多了。