Façade = fasada.
Ten przykład jest wzorowany na przykładzie przedstawionym w książce „HeadFirst Design Patterns”
Zadanie programistyczne
Smoki zakładają kino domowe w jaskini. System składa się z wielu różnych
urządzeń. Trzeba stworzyć uproszczony sterownik, który pozwoli
na włączanie i wyłączanie systemu bez kombinowania przy ustawieniach
poszczególnych urządzeń, umożliwiając jednak doświadczonym użytkownikom
takie kombinowanie.
Rozwiązanie zadania
Tworzymy klasę dla każdego urządzenia. Klasa pozwala wykonywać
wszystkie czynności dla niego przewidziane.
Klasa Wzmacniacz
jest potrzebna do działania urządzeń poza klasą Swiatlo
.
Klasa KinoDomoweFacade
stwarza 'pilota’ do prostego użytkowania kina
domowego przy najczęściej stosowanych ustawieniach.
Klasa KinoDomoweStart
jest przykładem użycia pilota.
Klasy
Klasa Wzmacniacz
package facade; class Wzmacniacz{ private final String opis; public Wzmacniacz(String description){ this.opis = description; } public void on() { System.out.println(opis + " włączony"); } public void off() { System.out.println(opis + " wyłączony"); } public void setStereoSound(boolean stereo) { System.out.println(opis + stereo + " włączone"); } public void setSurroundSound() { System.out.println(opis + " włączone 5 głośników i subwoofer"); } public void setVolume(int poziom) { System.out.println(opis + " setting volume to " + poziom); } public void setRadio(Radio radio) { System.out.println(opis + " teraz działa: " + radio); } public void setDvd(OdtwarzaczDVD dvd) { System.out.println(opis + " teraz działa DVD: " + dvd); } public void setCd(OdtwarzaczCD cd) { System.out.println(opis + " teraz działa CD: " + cd); } public void setBluRay(OdtwarzaczBluRay blu) { System.out.println(opis + " teraz działa BluRay: " + blu); } @Override public String toString() { return opis; } }
Klasa KinoDomoweFacade
package facade; class KinoDomoweFacade{ private final Wzmacniacz wzmacniacz; private final Radio radio; private final OdtwarzaczDVD dvd; private final OdtwarzaczCD cd; private final OdtwarzaczBluRay blu; private final TV tv; private final Swiatlo swiatla; public KinoDomoweFacade(Wzmacniacz wzmacniacz, Radio radio, OdtwarzaczBluRay blu, OdtwarzaczDVD dvd, OdtwarzaczCD cd, TV tv, Swiatlo swiatla){ this.wzmacniacz = wzmacniacz; this.blu = blu; this.radio = radio; this.dvd = dvd; this.cd = cd; this.tv = tv; this.swiatla = swiatla; } public void obejrzyjFilmDVD(String tytul) { System.out.println("Przygotowuję system do obejrznia filmu..."); swiatla.dim(10); wzmacniacz.on(); wzmacniacz.setDvd(dvd); dvd.on(); wzmacniacz.setSurroundSound(); wzmacniacz.setVolume(5); tv.on(); tv.wideScreenMode(); dvd.play(tytul); } public void zakonczFilmDVD() { System.out.println("Wyłączam film..."); swiatla.on(); tv.off(); wzmacniacz.off(); dvd.stop(); dvd.eject(); dvd.off(); } public void sluchajCD(String tytul) { System.out.println("Właczam Odtwarzacz CD..."); swiatla.dim(10); wzmacniacz.on(); wzmacniacz.setVolume(5); wzmacniacz.setCd(cd); wzmacniacz.setStereoSound(true); cd.on(); cd.play(tytul); } public void wylaczCD() { System.out.println("Wyłączam Odtwarzacz CD..."); wzmacniacz.off(); wzmacniacz.setCd(cd); cd.eject(); cd.off(); } public void wlaczRadio(double czestotliwosc) { System.out.println("Włączam radio..."); radio.on(); radio.setFrequency(czestotliwosc); wzmacniacz.on(); wzmacniacz.setVolume(5); wzmacniacz.setRadio(radio); } public void wylaczRadio() { System.out.println("Wyłączam radio..."); radio.off(); wzmacniacz.off(); } public void obejrzyjFilmBlue(String movie) { System.out.println("Przygotowuję system do obejrznia filmu..."); swiatla.dim(10); wzmacniacz.on(); wzmacniacz.setBluRay(blu); blu.on(); wzmacniacz.setSurroundSound(); wzmacniacz.setVolume(5); tv.on(); tv.wideScreenMode(); blu.set3D(true); blu.play(movie); } public void zakonczFilmBlue() { System.out.println("Wyłączam film..."); swiatla.on(); tv.off(); wzmacniacz.off(); blu.stop(); blu.eject(); blu.off(); } }
Klasa OdtwarzaczBluRay
package facade; class OdtwarzaczBluRay{ private final String opis; private int sciezka; private String film; public OdtwarzaczBluRay(String opis, Wzmacniacz wzm){ this.opis = opis; } public void on() { System.out.println(opis + " włączony"); } public void off() { System.out.println(opis + " wyłączony"); } public void eject() { film = null; System.out.println(opis + " tacka wysunięta"); } public void play(String film) { this.film = film; sciezka = 0; System.out.println(opis + " odtwarzanie: \"" + film + "\""); } public void play(int sciezka) { if(film == null){ System.out.println(opis + " nie moge odtworzyć: " + sciezka + ", brak CD"); } else{ this.sciezka = sciezka; System.out.println(opis + " sciezka: " + sciezka); } } public void stop() { sciezka = 0; System.out.println(opis + " zatrzymany"); } public void pause() { System.out.println(opis + " pauza: \"" + film + "\""); } public void setTwoChannelAudio() { System.out.println(opis + " ustawione dwa kanały audio"); } public void setSurroundAudio() { System.out.println(opis + " ustawiony tryb Surround"); } public void set3D(boolean tryb3D) { System.out.println("3D włączone: " + tryb3D); } @Override public String toString() { return opis; } }
Klasa Odtwarzacz CD
package facade; class OdtwarzaczCD{ private final String opis; private int sciezka; private String tytul; public OdtwarzaczCD(String opis, Wzmacniacz wzm){ this.opis = opis; } public void on() { System.out.println(opis + " włączony"); } public void off() { System.out.println(opis + " wyłączony"); } public void eject() { tytul = null; System.out.println(opis + " tacka wysunięta"); } public void play(String tytul) { this.tytul = tytul; sciezka = 0; System.out.println(opis + " odtwarzanie: \"" + tytul + "\""); } public void play(int sciezka) { if(tytul == null){ System.out.println(opis + " nie moge odtworzyć: " + sciezka + ", brak CD"); } else{ this.sciezka = sciezka; System.out.println(opis + " sciezka: " + sciezka); } } public void stop() { sciezka = 0; System.out.println(opis + " zatrzymany"); } public void pause() { System.out.println(opis + " pauza: \"" + tytul + "\""); } @Override public String toString() { return opis; } }
Klasa OdtwarzaczDVD
package facade; class OdtwarzaczDVD{ private final String opis; private int sciezka; private String film; public OdtwarzaczDVD(String opis, Wzmacniacz wzm){ this.opis = opis; } public void on() { System.out.println(opis + " włączony"); } public void off() { System.out.println(opis + " wyłączony"); } public void eject() { film = null; System.out.println(opis + " tacka wysunięta"); } public void play(String film) { this.film = film; sciezka = 0; System.out.println(opis + " odtwarzanie: \"" + film + "\""); } public void play(int sciezka) { if(film == null){ System.out.println(opis + " nie moge odtworzyć: " + sciezka + ", brak CD"); } else{ this.sciezka = sciezka; System.out.println(opis + " sciezka: " + sciezka); } } public void stop() { sciezka = 0; System.out.println(opis + " zatrzymany"); } public void pause() { System.out.println(opis + " pauza: \"" + film + "\""); } public void setTwoChannelAudio() { System.out.println(opis + " ustawione dwa kanały audio"); } public void setSurroundAudio() { System.out.println(opis + " ustawiony tryb Surround"); } @Override public String toString() { return opis; } }
Klasa Radio
package facade; class Radio{ private final String opis; public Radio(String opis, Wzmacniacz wzm){ this.opis = opis; } public void on() { System.out.println(opis + " włączone"); } public void off() { System.out.println(opis + " wyłączone"); } public void setFrequency(double czestotliwosc) { System.out.println(opis + " częstotliwosc: " + czestotliwosc); } public void setAm() { System.out.println(opis + " fale długie"); } public void setFm() { System.out.println(opis + " fale krótkie"); } @Override public String toString() { return opis; } }
Klasa Swiatlo
package facade; class Swiatlo{ private final String opis; public Swiatlo(String opis){ this.opis = opis; } public void on() { System.out.println(opis + " włączony"); } public void off() { System.out.println(opis + " wyłączony"); } public void dim(int poziom) { System.out.println(opis + " światło przyćmionie do " + poziom + "%"); } @Override public String toString() { return opis; } }
Klasa TV
package facade; class TV{ private final String opis; public TV(String opis, Wzmacniacz wzm){ this.opis = opis; } public void on() { System.out.println(opis + " włączone"); } public void off() { System.out.println(opis + " wyłączone"); } public void wideScreenMode() { System.out.println(opis + " tryb: 16 x 9"); } public void tvMode() { System.out.println(opis + " itryb: 4x3"); } public void setChannel(int kanal) { System.out.println("kanał: " + kanal); } @Override public String toString() { return opis; } }
Klasa KinoDOmoweStart
package facade; class KinoDomoweStart{ public static void main(String[] args) { Wzmacniacz wzmacniacz = new Wzmacniacz("WX-Stereo 1000W"); Radio tuner = new Radio("Radio AM/FM", wzmacniacz); OdtwarzaczDVD dvd = new OdtwarzaczDVD("Odtwarzacz DVD", wzmacniacz); OdtwarzaczCD cd = new OdtwarzaczCD("Odtwarzacz CD", wzmacniacz); OdtwarzaczBluRay blu = new OdtwarzaczBluRay("Odtwarzacz BluRay", wzmacniacz); TV tv = new TV("TV Stereo", wzmacniacz); Swiatlo swiatla = new Swiatlo("Swiatło"); KinoDomoweFacade kinoDomowe = new KinoDomoweFacade(wzmacniacz, tuner, blu, dvd, cd, tv, swiatla); kinoDomowe.obejrzyjFilmBlue("Avatar"); kinoDomowe.zakonczFilmBlue(); } }
Wynik
Przygotowuję system do obejrzenia filmu... Swiatło światło przyćmionie do 10% WX-Stereo 1000W włączony WX-Stereo 1000W teraz działa BluRay: Odtwarzacz BluRay Odtwarzacz BluRay włączony WX-Stereo 1000W włączone 5 głośników i subwoofer WX-Stereo 1000W setting volume to 5 TV Stereo włączone TV Stereo tryb: 16 x 9 3D włączone: true Odtwarzacz BluRay odtwarzanie: "Avatar" Wyłączam film... Swiatło włączony TV Stereo wyłączone WX-Stereo 1000W wyłączony Odtwarzacz BluRay zatrzymany Odtwarzacz BluRay tacka wysunięta Odtwarzacz BluRay wyłączony