Facade模式
外观模式又被称为门面模式。它是通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。
其实在实际生活中,像服务员、前台人员等等都充当【外观角色】。因为有了服务员,比如我们可以直接向她点餐、直接让他添点茶水、直接问他厕所怎么走等等,服务员的角色就聚合了很多“子系统”的功能,对于客户(客户端)而言,就只需要知道找服务员即可。如果自己去一个一个的问具体的人(具体服务),是很不方便的而且繁杂的。
1、场景描述
上面描述了服务员角色, 我们就用代码来实现这一场景。比如一个餐厅的功能有如下几个:
- 点餐
- 添茶
- 加汤
2、实现
/// <summary>/// 点餐/// </summary>public class Order{public void Excute(){Console.WriteLine("点餐");}}/// <summary>/// 汤/// </summary>public class Soup{public void AddSoup(){Console.WriteLine("加汤");}}/// <summary>/// 茶水/// </summary>public class Tea{public void AddTea(){Console.WriteLine("添茶");}}/// <summary>/// 服务员/// </summary>public class Waiter{private Order order;private Soup soup;private Tea tea;public Waiter(){order = new Order();soup = new Soup();tea = new Tea();}/// <summary>/// 点餐/// </summary>public void Order(){order.Excute();}/// <summary>/// 加汤/// </summary>public void AddSoup(){soup.AddSoup();}/// <summary>/// 添茶/// </summary>public void AddTea(){tea.AddTea();}}// 客户端Waiter waiter = new Waiter();waiter.Order();waiter.AddTea();waiter.AddSoup();
3、优缺点
上面的代码中, 尽管子系统很多(点餐、添茶、加汤),但对于客户端而言,只需要知道服务员这个类即可。总结起来外观模式有如下优点:
- 降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它客户端
- 屏蔽具体的实现细节
缺点就是:
