Facade

facade.png

Facadeというのは、、建築物の正面(デザイン)である。フランス語に由来し、英語のfaceと同根。最も目に付く場所であり、重要視される。
上の画像はBritney SpearsのMe Against the Music (feat. Madonna)のミュージックビデオです
Me Against MusicはGleeのバージョンもいいよねっ
すごく簡単に言うとFacadeは面倒な手続きをただまとめるだけのクラスってかんじ
すべてを覆い隠すという意味でFacadeという言葉を使用しているんだと思う。

概要

複雑なサブシステムを取り出し、一連のクラスのインタフェースを簡素化する
言い換えれば、
サブシステムの機能に対する簡素化されたインタフェースを提供するだけ

サブシステムの一連のインタフェースに対する、統合されたインタフェースを提供します。
Facadeはサブシステムをより使いやすくする高水準インタフェースを定義します

なぜこのパターンを使用するか?

  • サブシステムに対する簡素化されたインタフェースを提供すること

このパターンの使いどころ

クラス図

このパターンに必要な材料

  • いろいろなクラスを使った面倒な手続き

各材料の役割・関係

このパターンの良いところ

  • 複雑なサブシステムが使いやすくなる

実装の仕方

package headfirst.facade.hometheater;
 
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();
    }
 
    public void listenToCd(String cdTitle) {
        System.out.println("Get ready for an audiopile experence...");
        lights.on();
        amp.on();
        amp.setVolume(5);
        amp.setCd(cd);
        amp.setStereoSound();
        cd.on();
        cd.play(cdTitle);
    }
 
    public void endCd() {
        System.out.println("Shutting down CD...");
        amp.off();
        amp.setCd(cd);
        cd.eject();
        cd.off();
    }
 
    public void listenToRadio(double frequency) {
        System.out.println("Tuning in the airwaves...");
        tuner.on();
        tuner.setFrequency(frequency);
        amp.on();
        amp.setVolume(5);
        amp.setTuner(tuner);
    }
 
    public void endRadio() {
        System.out.println("Shutting down the tuner...");
        tuner.off();
        amp.off();
    }
}

このパターンが実際に使用されている例

関連パターン


law-of-demetre loose-coupling view wrapper

サポートサイト Wikidot.com law-of-demetreloose-couplingviewwrapper