外观模式的定义是:
在子系统中,为一组接口提供一个统一的接口。Facade定义一个高层接口要子系统更易用。
其UML类图的示例如下:
在这个模式中,参与者包括:
- Facade:
- 知道哪个子系统的类负责一个请求。
- 委托客户端请求合适的子系统对象。
- Subsystem classes:
- 实现子系统的功能。
- 处理Facade对象分配的工作。
- 不知道外观,不引用它。
实现代码:
class SubsystemA
{
public string OperationA1()
{
return "Subsystem A, Method A1\n";
}
public string OperationA2()
{
return "Subsystem A, Method A2\n";
}
}
class SubsystemB
{
public string OperationB1()
{
return "Subsystem B, Method B1\n";
}
public string OperationB2()
{
return "Subsystem B, Method B2\n";
}
}
class SubsystemC
{
public string OperationC1()
{
return "Subsystem C, Method C1\n";
}
public string OperationC2()
{
return "Subsystem C, Method C2\n";
}
}
public class Facade
{
SubsystemA a = new SubsystemA();
SubsystemB b = new SubsystemB();
SubsystemC c = new SubsystemC();
public void Operation1()
{
Console.WriteLine("Operation 1\n" +
a.OperationA1() +
a.OperationA2() +
b.OperationB1());
}
public void Operation2()
{
Console.WriteLine("Operation 2\n" +
b.OperationB2() +
c.OperationC1() +
c.OperationC2());
}
}
- 需要一个简单的接口访问复杂的系统。
- 抽象和子系统的实现是紧耦合的。
- 需要一个入口点给软件的每一层。
- facade模式特别地用于当系统非常复杂难于理解时,比如系统中有太多错综关系的类且源码不可见的时候。