Паттерн Фасад (Facade pattern) - предоставляет унифицированный интерфейс к группе интерфейсов подсистемы. Фасад определяет высокоуровневый интерфейс, упрощающий работу подсистемы. Основной целью фасада является упрощение работы с подсистемой за счет использования упрощенного интерфейса. Данный паттерн относится к структурным паттернам.
Рассмотрим пример использования петтерна.
/* tuner subsystem */
var tuner = {
on: function () {},
off: function () {},
setAm: function () {},
setFm: function () {},
setFrequency: function () {},
toString: function () {}
};
/* screen subsystem */
var screen = {
up: function () {},
down: function () {},
toString: function () {}
};
/* cdPlayer subsystem */
var cdPlayer = {
on: function () {},
off: function () {},
eject: function () {},
pause: function () {},
play: function () {},
stop: function () {},
toString: function () {}
};
/* dvdPlayer subsystem */
var dvdPlayer = {
on: function () {},
off: function () {},
eject: function () {},
pause: function () {},
play: function () {},
setSurroundAudio: function () {},
setTwoChannelAudio: function () {},
stop: function () {}
};
/* projector subsystem */
var projector = {
on: function () {},
off: function () {},
tvMode: function () {},
wideScreenMode: function () {},
toString: function () {}
};
/* popcornPopper subsystem */
var popcornPopper = {
on: function () {},
off: function () {},
pop: function () {},
toString: function () {}
};
/* theaterLights subsystem */
var theaterLights = {
on: function () {},
off: function () {},
dim: function () {},
toString: function () {}
};
/* amplifier subsystem */
var amplifier = {
on: function () {},
off: function () {},
setCd: function () {},
setDvd: function () {},
setStereoSound: function () {},
setSurroundSound: function () {},
setTuner: function () {},
setVolume: function () {},
toString: function () {}
};
/* facade */
var HomeTheaterFacade = function (amplifier,
tuner,
dvdPlayer,
cdPlayer,
projector,
screen,
theaterLights,
popcornPopper) {
var amp = amplifier,
tuner = tuner,
dvd = dvdPlayer,
cd = cdPlayer,
projector = projector,
screen = screen,
lights = theaterLights,
popper = popcornPopper;
this.watchMovie = function (movie) {
console.log("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);
};
this.endMovie = function () {
console.log("Shutting movie theater down...");
popper.off();
lights.off();
screen.up();
projector.off();
amp.off();
dvd.stop();
dvd.eject();
dvd.off();
};
// other methods...
};
var homeTheater = new HomeTheaterFacade(amplifier, tuner, dvdPlayer, cdPlayer,
projector, screen, theaterLights, popcornPopper);
homeTheater.watchMovie("Raiders of the Lost Ark");
homeTheater.endMovie();
На выходе:
Get ready to watch a movie...
Shutting movie theater down...
На примере видна польза фасада - упрощение интерфейса работы с подсистемами, иначе это было бы намного сложнее.