外观模式提供了一个统一的接口,用来访问子系统中的一群接口.让子系统更容易使用.主要应用了OO设计原则中的最少知识原则,减少对象间的交互,只和你有关的人交谈;降低耦合;

我们看一个家庭影院的例子,监听影院系统,只需要暴露几个用户关心的方法,看电影,结束电影,其他的影院设备控制不需要跑路给用户,采用外观模式,将将这个子系统封装一个外观.

代码如下:

家庭影院外观类:

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();

    }

}

影院中各种视听设备类:

public class Amplifier {

    String description;

    Tuner tuner;

    DvdPlayer dvd;

    CdPlayer cd;

   

    public Amplifier(String description) {

       this.description = description;

    }

 

    public void on() {

       System.out.println(description + " on");

    }

 

    public void off() {

       System.out.println(description + " off");

    }

 

    public void setStereoSound() {

       System.out.println(description + " stereo mode on");

    }

 

    public void setSurroundSound() {

       System.out.println(description + " surround sound on (5 speakers, 1 subwoofer)");

    }

 

    public void setVolume(int level) {

       System.out.println(description + " setting volume to " + level);

    }

 

    public void setTuner(Tuner tuner) {

       System.out.println(description + " setting tuner to " + dvd);

       this.tuner = tuner;

    }

 

    public void setDvd(DvdPlayer dvd) {

       System.out.println(description + " setting DVD player to " + dvd);

       this.dvd = dvd;

    }

 

    public void setCd(CdPlayer cd) {

       System.out.println(description + " setting CD player to " + cd);

       this.cd = cd;

    }

 

    public String toString() {

       return description;

    }

}

public class CdPlayer {

    String description;

    int currentTrack;

    Amplifier amplifier;

    String title;

   

    public CdPlayer(String description, Amplifier amplifier) {

       this.description = description;

       this.amplifier = amplifier;

    }

 

    public void on() {

       System.out.println(description + " on");

    }

 

    public void off() {

       System.out.println(description + " off");

    }

 

    public void eject() {

       title = null;

       System.out.println(description + " eject");

    }

 

    public void play(String title) {

       this.title = title;

       currentTrack = 0;

       System.out.println(description + " playing \"" + title + "\"");

    }

 

    public void play(int track) {

       if (title == null) {

           System.out.println(description + " can't play track " + currentTrack +

                  ", no cd inserted");

       } else {

           currentTrack = track;

           System.out.println(description + " playing track " + currentTrack);

       }

    }

 

    public void stop() {

       currentTrack = 0;

       System.out.println(description + " stopped");

    }

 

    public void pause() {

       System.out.println(description + " paused \"" + title + "\"");

    }

 

    public String toString() {

       return description;

    }

}

只列了部分代码,完整代码可到51下载中有。

测试类:

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();

    }

}