外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用,它是一种对象结构型模式。
结构:
角色:
Facade角色:客户端可以调用这个角色的方法,了解相关子系统(一个或多个)的功能和责任,将客户的请求委派给适当的子系统对象 。
Subsystem classes角色:每一个子系统都不是一个单独的类,而是一个类的集合。子系统并不知道门面的存在,对于子系统而言,门面仅仅是另外一个客户端而已。
示例代码:
using System;
using System.Collections.Generic;
using System.Text;
namespace FacadeExample
{
class Program
{
static void Main(string[] args)
{
PayFacacde pf = new PayFacacde();
Console.WriteLine("order:" + pf.CreateOrder("yzhu", 0, 1, 12) + " created");
}
}
class PayFacacde
{
private AccountSystem account = new AccountSystem();
private CardSystem card = new CardSystem();
private PaySystem pay = new PaySystem();
public string CreateOrder(string userName, int cardID, int cardCount, int areaID)
{
int userID = account.GetUserIDByUserName(userName);
if (userID == 0)
return string.Empty;
if (!account.UserIsActived(userID, areaID))
return string.Empty;
if (!card.CardHasStock(cardID, cardCount))
return string.Empty;
return pay.CreateOrder(userID, cardID, cardCount);
}
}
class AccountSystem
{
public bool UserIsActived(int userID, int areaID)
{ return true; }
public int GetUserIDByUserName(string userName)
{ return 123; }
}
class CardSystem
{
public bool CardHasStock(int cardID, int cardCount)
{ return true; }
}
class PaySystem
{
public string CreateOrder(int userID, int cardID, int cardCount)
{ return "0000000001"; }
}
}
Facade模式使用要点:
从客户程序的角度来看, Facade模式不仅简化了整个组件系统的接口,同时对于组件内部与外部客户程序来说,从某种程度上也达到了一种“解耦”的效果——内部子系统的任何变化不会影响到Facade接口的变化。
Facade设计模式更注重从架构的层次去看整个系统,而不是单个类的层次。Facade很多时候更是一种架构设计模式。