意圖
為子系統中的一組接口提供一個一致的界面,Facade模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。
場景
在一個為游戲充值的網站中,創建訂單需要與三個外部接口打交道:
l 用戶系統:根據用戶名獲取用戶ID、查看用戶是否已經激活了游戲
l 卡系統:查看某種類型的充值卡是否還有庫存
l 充值系統:創建一個訂單,並且返回訂單號
如果直接讓網站和三個外部接口發生耦合,那麼網站因為外部系統接口修改而修改的概率就很大了,並且就這些小接口來說並不是十分友善,它們提供的大多數是工具方法,具體怎麼去使用還是要看充值網站創建訂單的邏輯。
Facade的思想就是在小接口上封裝一個高層接口,屏蔽子接口的調用,提供外部更簡潔,更易用的接口。
示例代碼
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";
}
}
}