类型:结构型模式。
适用性:
- 当子系统非常复杂时,使得客户调用非常麻烦,不便于使用。这个时候就可以使用外观模式将这些子系统封装起来,提供一个统一而简单接口供客户端使用。
- 当需要构建一个层次结构的子系统时,使用外观模式可以给子系统定义进入口。
概述:
外观模式主要依赖“迪米特法则”,即尽量减少与其他实体之间的联系。例如,用户和一台电脑。如果用户想开机,他不需要云单独打开电源,再启动CPU,再启动硬盘电源,再连接显示器。用户不需要知道电脑开机完成了哪些工作,用户只想开机了就可以正常使用电脑就行了。用户要做的,只是按一下开机键,所有的一切都会在这一个开机动作中自动完成。减少用户对电脑内部的了解,这样能够使得用户更方便地使用电脑,而且如果电脑开机有问题,也不需要云从用户身上找,直接去电脑上面找就可以,能够更方便地定位问题。
类图:

参与者:< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPG9sIHR5cGU9"1">
- Client,客户端,直接与Computer交互。
- Computer,由Display,Power,HardDisk几个子系统构成。并且提供一个Startup的接口用来一次性控制所有子系统启动。
- Display,Power,HardDisk,子系统,完成Computer指派的功能。
示例代码:
// C# namespace Design11 { class Power { public void Start() { Console.WriteLine("启动电源"); } } class Display { public void DisplayContent() { Console.WriteLine("显示内容"); } } class HardDisk { public void ReadDisk() { Console.WriteLine("读取硬盘数据"); } } // Fasade class Computer { private Power power = new Power(); private Display display = new Display(); private HardDisk hDisk = new HardDisk(); public void Startup() { power.Start(); display.DisplayContent(); hDisk.ReadDisk(); } } // Client class Program { static void Main(string[] args) { Computer computer = new Computer(); Console.WriteLine("准备启动电脑"); computer.Startup(); } } }优点:使得代码更加模块化,更方便调用以及查找问题。
注意:如果有多个子系统需要进行通讯时,最好是通过Facade来中转。
参考资料:
- 《设计模式――可复用面向对象软件基础》
- 《大话设计模式》
- 《Head First设计模式》
- 《大话设计模式》
- 《设计模式――可复用面向对象软件基础》
- 当需要构建一个层次结构的子系统时,使用外观模式可以给子系统定义进入口。