定义:
提供一个统一的接口去访问多个子系统的多个不同的接口。外观模式定义了一个高层次的接口,使得子系统更容易被使用。
UML示意图
外观类1、知道哪些子系统,知道处理哪些请求
2、将客户的请求传递给子系统处理
子系统类1、实现了子系统的功能
2、处理由外观类传过来的任务
3、子系统无需知道外观类,在任何地方也没有引用外观类。
现实中的例子:
我们去餐厅吃饭,只需将菜单传递给服务员即可。服务员就是这里的外观类,服务员会将请求传递给厨房里的厨师、传菜工等服务生。
以下代码取自DoFactory
using System;
namespace DoFactory.GangOfFour.Facade.Structural
{
//客户端调用
class MainApp
{
public static void Main()
{
Facade facade = new Facade();
facade.MethodA();
facade.MethodB();
Console.Read();
}
}
// 子系统1
class SubSystemOne
{
public void MethodOne()
{
Console.WriteLine(" SubSystemOne Method");
}
}
// 子系统2
class SubSystemTwo
{
public void MethodTwo()
{
Console.WriteLine(" SubSystemTwo Method");
}
}
// 子系统3
class SubSystemThree
{
public void MethodThree()
{
Console.WriteLine(" SubSystemThree Method");
}
}
// 子系统4
class SubSystemFour
{
public void MethodFour()
{
Console.WriteLine(" SubSystemFour Method");
}
}
// 外观类
class Facade
{
//外观类知道它要处理哪些子系统
SubSystemOne one;
SubSystemTwo two;
SubSystemThree three;
SubSystemFour four;
public Facade()
{
one = new SubSystemOne();
two = new SubSystemTwo();
three = new SubSystemThree();
four = new SubSystemFour();
}
//外观类中某些方法会委托给子系统去执行
public void MethodA()
{
Console.WriteLine("\nMethodA() ---- ");
one.MethodOne();
two.MethodTwo();
four.MethodFour();
}
public void MethodB()
{
Console.WriteLine("\nMethodB() ---- ");
two.MethodTwo();
three.MethodThree();
}
}
}
外观模式提供了一个简单的公有接口去处理复杂的子系统,并且没有减少子系统的功能。
它避免了客户端直接去同复杂的子系统去直接交互。
当然,如果你需要高级的功能,也可直接去调用子系统。
对于外观模式,head first中的例子就特别有代表性。