首先,F(xiàn)açade模式的作用是什么?簡(jiǎn)化接口。比如我們買電腦,當(dāng)電腦店店員把機(jī)子組裝好后交給我們,我們拿回家把顯示器鍵盤等的插頭都插到機(jī)箱后面,然后用電腦時(shí)只要按一下主機(jī)箱上的電源,電腦就啟動(dòng)了,我們無(wú)需關(guān)心機(jī)箱內(nèi)部各個(gè)部件是如何啟動(dòng),是CPU先過(guò)電還是硬盤先過(guò)電。在這里,這個(gè)機(jī)箱就可以認(rèn)為是一個(gè)Façade,這個(gè)Façade(機(jī)箱)就使啟動(dòng)電腦變得很容易,就算是一個(gè)完全不懂電腦的人,也知道如何啟動(dòng)電腦了。這就是Façade最大作用所在:簡(jiǎn)化接口,使得客戶程序(人)更方便地使用子系統(tǒng)(電腦)。試想,如果沒(méi)有機(jī)箱,那我們想啟動(dòng)電腦豈不是得去記先啟動(dòng)CPU還是先啟動(dòng)硬盤?要怎么啟動(dòng)它們?同時(shí),F(xiàn)açade也讓系統(tǒng)耦合度更低,因?yàn)槟悴恍枰苯痈鶦PU、硬盤等直接接觸了。
接下來(lái)就用代碼示例一下: 下面是幾個(gè)電腦配件類,它們都有一個(gè)Run()方法和一個(gè)Stop()方法,分別表示它們的啟動(dòng)和關(guān)閉: //CPU internal class CPU { public void Run() {
Console.WriteLine("Cpu is running...");
}
public void Stop() {
Console.WriteLine("Cpu stopped.");
}
}
//主板 internal class MainBoard {
public void Run() {
Console.WriteLine("MainBoard is running...");
}
public void Stop() {
Console.WriteLine("MainBoard stopped.");
}
}
//硬盤 internal class HardDisk {
public void Run() {
Console.WriteLine("HardDisk is running...");
}
public void Stop() {
Console.WriteLine("HardDisk stopped.");
}
}
//內(nèi)存 internal class Memory {
public void Run() {
Console.WriteLine("Memory is running...");
}
public void Stop() {
Console.WriteLine("Memory stopped.");
}
}
//電源 internal class Power {
public void Run() {
Console.WriteLine("Power is running...");
}
public void Stop() {
Console.WriteLine("Power stopped");
}
}
然后是個(gè)主機(jī)類(Facade):
/// <summary> /// 電腦主機(jī)(Façade(外觀)類) /// </summary> public class HostComputerFacade {
private CPU cpu;
private MainBoard mainBoard;
private HardDisk hardDisk;
private Memory memory;
private Power power;
//構(gòu)造方法,初始化各個(gè)配件 public HostComputerFacade() {
cpu = new CPU();
mainBoard = new MainBoard();
hardDisk = new HardDisk();
memory = new Memory();
power = new Power();
}
//啟動(dòng)電腦,我不知道各配件的啟動(dòng)順序如何,我們不妨假設(shè)它們就按如下順序啟動(dòng) public void TurnOn() {
power.Run();
mainBoard.Run();
cpu.Run();
memory.Run();
hardDisk.Run();
}
//關(guān)閉電腦 public void ShutDown() {
hardDisk.Stop();
memory.Stop();
cpu.Stop();
mainBoard.Stop();
power.Stop();
}
}
然后我們就可以在Main()方法中使用“電腦”了:
public static void Main(string[] args) {
HostComputerFacade hcf = new HostComputerFacade();
hcf.TurnOn();
//…這里做一些使用電腦的操作
hcf.ShutDown(); }
Look,客戶程序要是想“使用電腦”的話,只要實(shí)例化主機(jī),然后按下電源開關(guān)(TurnOn()),相箱內(nèi)各部件就自動(dòng)按順序啟動(dòng)了,再長(zhǎng)按電源開關(guān)幾秒鐘(ShutDown()),機(jī)箱內(nèi)各部件就按順序停止了,而如果沒(méi)有這個(gè)HostComputerFacade類的話,我們就要親自動(dòng)手讓Power啟動(dòng)、再讓MainBoard啟動(dòng),然后再讓CPU啟動(dòng)…,關(guān)的時(shí)候也要先讓HardDisk停止,再讓Memory停止…,那豈不太麻煩了,對(duì)吧?
總 結(jié): Facade模式的作用就在于簡(jiǎn)化接口,同時(shí)更松耦合,而各個(gè)子系統(tǒng)之間一般是聯(lián)系比較緊的,就像機(jī)箱內(nèi)的各配件,在某種意義上說(shuō),它們之間的聯(lián)系是挺緊的。
|