我喜欢Eric Freeman, Elisabeth Freeman, Kathy Sierra, Bert Bates - Head First Design Patterns 书中的一个例子。
例子:
假设您创建了家庭影院,最后您想看电影。所以你必须这样做:
Amplifier amplifier = new Amplifier();
CdPlayer cdPlayer = new CdPlayer();
DvdPlayer dvdPlayer = new DvdPlayer();
Lights lights = new Lights();
PopcornPopper popcornPopper = new PopcornPopper();
Projector projector = new Projector();
Screen screen = new Screen();
popcornPopper.turnOn();
popcornPopper.pop();
amplifier.turnOn();
amplifier.setVolume(10);
lights.turnOn();
lights.dim(10);
screen.up();
dvdPlayer.turnOn();
dvdPlayer.play();
电影结束后会发生什么?你必须做同样的事情,但顺序相反,所以观看和结束电影的复杂性变得非常复杂。外观模式说你可以创建一个外观并让用户只调用一个方法而不是调用所有这些。
让我们创建门面:
public class HomeTheatherFacade {
Amplifier amplifier;
DvdPlayer dvdPlayer;
CdPlayer cdPlayer;
Projector projector;
Lights lights;
Screen screen;
PopcornPopper popcornPopper;
public HomeTheatherFacade(Amplifier amplifier, DvdPlayer dvdPlayer, CdPlayer cdPlayer, Projector projector, Lights lights, Screen screen, PopcornPopper popcornPopper) {
this.amplifier = amplifier;
this.dvdPlayer = dvdPlayer;
this.cdPlayer = cdPlayer;
this.projector = projector;
this.lights = lights;
this.screen = screen;
this.popcornPopper = popcornPopper;
}
public void watchMovie(String movieTitle) {
popcornPopper.turnOn();
popcornPopper.pop();
amplifier.turnOn();
amplifier.setVolume(10);
lights.turnOn();
lights.dim(10);
screen.up();
dvdPlayer.turnOn();
dvdPlayer.play();
}
public void endMovie() {
dvdPlayer.turnOff();
screen.down();
lights.turnOff();
amplifier.turnOff();
}
}
现在您可以调用 watchMovie 和 endMovie 方法,而不是调用所有这些方法:
public class HomeTheatherFacadeTest {
public static void main(String[] args){
Amplifier amplifier = new Amplifier();
CdPlayer cdPlayer = new CdPlayer();
DvdPlayer dvdPlayer = new DvdPlayer();
Lights lights = new Lights();
PopcornPopper popcornPopper = new PopcornPopper();
Projector projector = new Projector();
Screen screen = new Screen();
HomeTheatherFacade homeTheatherFacade = new HomeTheatherFacade(amplifier, dvdPlayer, cdPlayer, projector, lights, screen, popcornPopper);
homeTheatherFacade.watchMovie("Home Alone");
homeTheatherFacade.endMovie();
}
}
所以:
“外观模式为一组
子系统中的接口。 Facade 定义了一个更高级别的接口
使子系统更易于使用。”