Wzorzec projektowy Façade

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 obejrznia 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

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *