假設(shè)家里有一組家庭影院,包括:燈光,幻燈屏幕,揚(yáng)聲器,DVD。如果我們想打開這些設(shè)備開始看電影,必須先進(jìn)行如下操作:
關(guān)燈——放下屏幕——打開揚(yáng)聲器——打開DVD。
實(shí)現(xiàn)如下:
package javaapplication35;
public class Main {
public static void main(String[] args) {
Light light=new Light();
light.turnOff();
Screen screen=new Screen();
screen.down();
Amplifier amplifier=new Amplifier();
amplifier.On();
Dvdplayer player=new Dvdplayer();
player.On();
}
}
class Light {
public void turnOn() {
System.out.println("Lights Turn On");
}
public void turnOff() {
System.out.println("Lights Turn Off");
}
}
class Screen {
public void down() {
System.out.println("Put the Screen Down");
}
public void up() {
System.out.println("Put the Screen Up");
}
}
class Amplifier {
public void On() {
System.out.println("Turn Sound Amplifier On");
}
public void Off() {
System.out.println("Turn Sound Amplifier Off");
}
}
class Dvdplayer {
public void On() {
System.out.println("Turn the DVD player On");
}
public void Off() {
System.out.println("Turn the DVD player Off");
}
}
可以看到,想看部電影,在客戶端(主程序)要進(jìn)行N多操作后才行。其實(shí)如果設(shè)備更多,比如說還要調(diào)整音頻屬性,切換DVD專屬頻道,打開空調(diào)等。每次我想看部電影,就要重復(fù)執(zhí)行這些命令。
可不可執(zhí)行一次命令就可以搞定一切呢?很簡單,專門寫個類,寫個函數(shù)實(shí)現(xiàn)這一串命令就可以了。客戶端到時候就只要調(diào)用這個新增的類中的函數(shù)即可。
把主函數(shù)的過程直接移去到另一個類的函數(shù)中:
public class Main {
public static void main(String[] args) {
(new TheaterFacade()).WatchDvd();
}
}
class TheaterFacade {
public void WatchDvd() {
Light light = new Light();
light.turnOff();
Screen screen = new Screen();
screen.down();
Amplifier amplifier = new Amplifier();
amplifier.On();
Dvdplayer player = new Dvdplayer();
player.On();
}
}
這個就是最基本的Façade Pattern。前提條件是:當(dāng)客戶端要實(shí)現(xiàn)某個功能的時候,必須要調(diào)用一連串的類及其函數(shù)。
為了實(shí)現(xiàn)“一鍵”功能能,就在客戶端和眾多的類庫(實(shí)現(xiàn)具體過程)中間,添加一個Façade類,類中的方法實(shí)現(xiàn)了各種不同的“一鍵功能”(一鍵打開家庭影院,一鍵關(guān)閉。。。)
這樣做還有一個好處就是隔離了客戶端和起具體實(shí)現(xiàn)作用的類庫。
最后,上面的TheaterFacade類還可以寫的更靈活點(diǎn),因?yàn)樯厦娴某绦虬褜?shí)例化Light,Screen等放到了具體的方法內(nèi)部,這樣當(dāng)我想“關(guān)家庭影院”時,因?yàn)檎也坏骄唧w對象就沒法操作了。
把實(shí)例化放到具體方法外面,并添加一個構(gòu)造函數(shù),以便可以指定特定的播放儀器(比如家里有兩個揚(yáng)聲器的時候?)
package javaapplication35;
public class Main {
public static void main(String[] args) {
Light light = new Light();
Screen screen = new Screen();
Amplifier amplifier = new Amplifier();
Dvdplayer dvdplayer = new Dvdplayer();
TheaterFacade facade = new TheaterFacade(light, screen, amplifier, dvdplayer);
facade.WatchDvd();
facade.CloseDvd();
}
}
class TheaterFacade {
Light light;
Screen screen;
Amplifier amplifier;
Dvdplayer dvdplayer;
TheaterFacade(Light light, Screen screen, Amplifier amplifier, Dvdplayer dvdplayer) {
this.light = light;
this.screen = screen;
this.amplifier = amplifier;
this.dvdplayer = dvdplayer;
}
public void WatchDvd() {
light.turnOff();
screen.down();
amplifier.On();
dvdplayer.On();
}
public void CloseDvd() {
light.turnOn();
screen.up();
amplifier.Off();
dvdplayer.Off();
}
}
class Light {
public void turnOn() {
System.out.println("Lights Turn On");
}
public void turnOff() {
System.out.println("Lights Turn Off");
}
}
class Screen {
public void down() {
System.out.println("Put the Screen Down");
}
public void up() {
System.out.println("Put the Screen Up");
}
}
class Amplifier {
public void On() {
System.out.println("Turn Sound Amplifier On");
}
public void Off() {
System.out.println("Turn Sound Amplifier Off");
}
}
class Dvdplayer {
public void On() {
System.out.println("Turn the DVD player On");
}
public void Off() {
System.out.println("Turn the DVD player Off");
}
}