假設家里有一組家庭影院,包括:燈光,幻燈屏幕,揚聲器,DVD。如果我們想打開這些設備開始看電影,必須先進行如下操作:
關燈——放下屏幕——打開揚聲器——打開DVD。
實現如下:
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");
}
}
可以看到,想看部電影,在客戶端(主程序)要進行N多操作后才行。其實如果設備更多,比如說還要調整音頻屬性,切換DVD專屬頻道,打開空調等。每次我想看部電影,就要重復執行這些命令。
可不可執行一次命令就可以搞定一切呢?很簡單,專門寫個類,寫個函數實現這一串命令就可以了。客戶端到時候就只要調用這個新增的類中的函數即可。
把主函數的過程直接移去到另一個類的函數中:
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。前提條件是:當客戶端要實現某個功能的時候,必須要調用一連串的類及其函數。
為了實現“一鍵”功能能,就在客戶端和眾多的類庫(實現具體過程)中間,添加一個Façade類,類中的方法實現了各種不同的“一鍵功能”(一鍵打開家庭影院,一鍵關閉。。。)
這樣做還有一個好處就是隔離了客戶端和起具體實現作用的類庫。
最后,上面的TheaterFacade類還可以寫的更靈活點,因為上面的程序把實例化Light,Screen等放到了具體的方法內部,這樣當我想“關家庭影院”時,因為找不到具體對象就沒法操作了。
把實例化放到具體方法外面,并添加一個構造函數,以便可以指定特定的播放儀器(比如家里有兩個揚聲器的時候?)
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");
}
}