C 設計模式之 Facade

2022-05-21 02:41:01 字數 2537 閱讀 1953

為子系統中的一組介面提供乙個一致的介面,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";

**執行結果如下圖:

**說明

l         payfacade類就是門面型別,提供給客戶端呼叫,它本身呼叫子介面。可以看到,建立乙個訂單首先要根據使用者名稱獲取使用者id、然後要看使用者是否已經啟用了遊戲、然後看充值卡是否有庫存,最後才是建立訂單。

l         accountsystem、cardsystem以及paysystem就是子介面,它們提供了賬戶、卡以及充值相關的一些介面方法。

l         facade模式太常用了,把和多方關聯的邏輯**再進行一次封裝,提供乙個高層介面就是facade的思想。比如在做論壇程式的時候,一些操作需要呼叫許可權訪問模組(發帖、管理帖子),另外一些操作可以直接呼叫(首頁論壇板塊、登陸)資料訪問模組,由**來做這個判斷並呼叫不同的子模組並不合適,可以加乙個業務邏輯層來統一接受**各種操作請求,這其實就是facade。

何時採用

l         從**角度來說, 如果你的程式有多個類是和一組其它介面發生關聯的話可以考慮在其中加乙個門面型別。

l         從應用角度來說, 如果子系統的介面是非常細的,呼叫方也有大量的邏輯來和這些介面發生關係,那麼就可以考慮使用facade把客戶端與子系統的直接耦合關係進行化解。你可能會說,子系統改了門面不是照樣改?的確是需要改,但是如果客戶端本身的工作已經比較複雜,或者說可能有多個需要呼叫門面的地方,這個時候門面的好處就體現了。

實現要點

l         通過乙個高層介面讓子系統和客戶端不發生直接關聯,使客戶端不受子系統變化的影響。

l         facade不僅僅針對**級別,在構架上,特別是web應用程式的構架上,facade的應用非常普遍。

注意事項

l         facade不一定只能是乙個,可以考慮把門面進行細分。

設計模式之Facade

facade模式的定義 為子系統中的一組介面提供乙個一致的介面.facade乙個典型應用就是資料庫jdbc的應用,如下例對資料庫的操作 public class dbcompare connection conn null preparedstatement prep null resultset ...

設計模式之Facade

facade模式的定義 為子系統中的一組介面提供乙個一致的介面.facade乙個典型應用就是資料庫jdbc的應用,如下例對資料庫的操作 public class dbcompare catch ception e finally 上例是jsp中最通常的對資料庫操作辦法.在應用中,經常需要對資料庫操作...

設計模式之Facade

facade 模式也叫外觀模式,是由gof提出的23種設計模式中的一種。facade 模式為一組具有類似功能的類群,比如類庫,子系統等等,提供乙個一致的簡單的介面 這個一致的簡單的介面被稱作facade。本文介紹設計模式中的外觀 facade 模式的概念,用法,以及實際應用中怎麼樣使用facade模...