外观模式(Facade pattern)【使用频率:★★★★★】
1. 概述
为复杂的子系统中提供一个统一的入口,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式是迪米特法则的一种具体实现,通过引入一个新的外观角色可以降低原有系统的复杂度,同时降低客户类与子系统的耦合度。
2. 模式中的角色
2.1 外观类(Facade):在外观角色中可以知道相关的(一个或者多个)子系统的功能和责任;在正常情况下,它将所有从客户端发来的请求委派到相应的子系统去,传递给相应的子系统对象处理。
2.2 子系统类集合(SubSystem Classes):子系统类集合实现了子系统的功能,处理外观类对象指派的任务。
3. 模式解读
3.1 模式的类图
3.2 外观模式的代码实现
using System;
namespace ConsoleApp2
{
class Class22
{
static void Main(string[] args)
{
// 由于Facade的作用,客户端可以根本不知道子系统类的存在
Facade facade = new Facade();
facade.MethodA();
facade.MethodB();
Console.Read();
}
}
/// <summary>
/// 子系统中的一个类
/// </summary>
public class SubSystemOne
{
public void MethodeOne()
{
Console.WriteLine("Sub System first method.");
}
}
/// <summary>
/// 子系统中一个类
/// </summary>
public class SubSystemTwo
{
public void MethodTwo()
{
Console.WriteLine("Sub System second method.");
}
}
/// <summary>
/// 子系统中一个类
/// </summary>
public class SubSystemThree
{
public void MethodThree()
{
Console.WriteLine("Sub System third method.");
}
}
/// <summary>
/// 子系统中一个类
/// </summary>
public class SubSystemFour
{
public void MethodFour()
{
Console.WriteLine("Sub System fourth method.");
}
}
/// <summary>
/// 外观类
/// </summary>
public class Facade
{
private SubSystemOne one;
private SubSystemTwo two;
private SubSystemThree three;
private SubSystemFour four;
public Facade()
{
one = new SubSystemOne();
two = new SubSystemTwo();
three = new SubSystemThree();
four = new SubSystemFour();
}
public void MethodA()
{
Console.WriteLine("\nMethod group A----");
one.MethodeOne();
two.MethodTwo();
four.MethodFour();
}
public void MethodB()
{
Console.WriteLine("\nMethod group B----");
two.MethodTwo();
three.MethodThree();
}
}
}
4. 模式总结
4.1 优点
- Facade模式降低了客户端对子系统使用的复杂性。
- 外观模式松散了客户端与子系统的耦合关系,让子系统内部的模块能更容易扩展和维护。
- 通过合理使用Facade,可以帮助我们更好的划分访问的层次。
4.2 缺点
过多的或者是不太合理的Facade也容易让人迷惑,到底是调用Facade好呢,还是直接调用模块好。
5. 适用场景
- 需要将设计进行分层时考虑Facade模式。
- 在开发阶段,子系统往往因为重构变得越来越复杂,增加外观模式可以提供一个简单的接口,减少它们之间的依赖。
- 在维护一个遗留的大型系统时,可以这个系统已经非常难以维护和扩展,可以为新系统开发一个Facade类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂的工作。