首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

.NET 設計模式精解(十二):外觀模式——簡化子系統介面,解耦客戶端與內部複雜度

     編輯:關於.NET

軟體開發中,客戶程式常與複雜子系統產生耦合,導致子系統變更波及客戶端。外觀模式提供統一高層介面,屏蔽內部複雜度,實現客戶端與子系統鬆耦合。

一、模式意圖與示意

意圖:為子系統群提供一致介面,定義高層介面讓子系統更易用。(GoF)

示意物件圖:

外觀模式示意物件圖

二、生活實例:電話訂購目錄

消費者撥打單一客服專線 (外觀),客服代表整合訂貨、收銀、物流三部門介面,消費者無需知曉內部分工:

電話訂購外觀模式示意

三、房貸審核系統:從緊耦合到外觀模式

無外觀:客戶端直接依賴三子系統


public class Bank { public bool HasSufficientSavings(Customer c, int amt) => true; }
public class Credit { public bool HasGoodCredit(Customer c) => true; }
public class Loan { public bool HasNoBadLoans(Customer c) => true; }
// 客戶端
var bank = new Bank(); var credit = new Credit(); var loan = new Loan();
var eligible = bank.HasSufficientSavings(c, 12000) && loan.HasNoBadLoans(c) && credit.HasGoodCredit(c);

客戶端與三子系統緊耦合,任一變更皆波及客戶端。

引入外觀:Mortgage 統一介面


public class Mortgage {
    private Bank _bank = new Bank();
    private Loan _loan = new Loan();
    private Credit _credit = new Credit();
    public bool IsEligible(Customer cust, int amount) {
        Console.WriteLine($"{cust.Name} applies for {amount:C} loan");
        return _bank.HasSufficientSavings(cust, amount)
            && _loan.HasNoBadLoans(cust)
            && _credit.HasGoodCredit(cust);
    }
}
// 客戶端
var mortgage = new Mortgage();
var eligible = mortgage.IsEligible(new Customer("Ann"), 125000);

客戶端僅依賴 Mortgage,內部子系統變更不影響客戶端。

四、.NET N 層架構中的外觀層實戰

典型四層架構:UI → Business Facade → Business Rule → Data Access。Facade 職責:接收 UI 輸入、判斷路由 (唯讀直達 DA / 寫入經 BR)、維護臨時狀態、回傳結果。

N層架構外觀層

Duwamish 專案實例

Duwamish 架構圖

查詢商品類別 (唯讀 → 直達 DA)


// UI
var categorySet = productSystem.GetCategories(categoryID);
// Facade
public CategoryData GetCategories(int categoryId) {
    using (var da = new Categories()) return da.GetCategories(categoryId);
}

新增訂單 (寫入 → 經 BR)


// UI
cartOrderData = (new OrderSystem()).AddOrder(cartOrderData);
// Facade
public OrderData AddOrder(OrderData order) {
    new BusinessRules.Order().InsertOrder(order); return order;
}
// Business Rule 執行複雜驗證與計算後呼叫 DA
public bool InsertOrder(OrderData order) {
    // 驗證運費、稅金、地址、付款資訊、明細小計...
    using (var da = new DataAccess.Orders()) return da.InsertOrderDetail(order) > 0;
}

五、效果、實現要點與適用性

  • 屏蔽複雜度:減少客戶端處理物件數量,子系統更易用。
  • 鬆耦合:子系統內部緊耦合,但與客戶端鬆耦合,內部變更不外溢。
  • 彈性選擇:不限制直接使用子系統類,可在易用性與通用性間取捨。
  • 適用場景:複雜子系統簡化介面、提高子系統獨立性、層次化架構定義層進入點。

六、總結

外觀模式聚焦簡化介面,屬架構層面模式而非單一類別層面。它為系統劃定清晰邊界,是分層架構設計中不可或缺的穩定器。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved