設計模式-外觀模式(Facade)

簡介數據庫

外觀模式(Facade),將外部與內部子系統的通訊經過一個統一的門面對象進行。spa

由兩部分組成:code

  1. 門面角色:供外部調用,內部可能組裝了多個子系統,多個方法。
  2. 子系統角色:子系統的方法也能夠直接供外部調用。通常來講,將經常使用的方法放在門面角色裏面調用,門面角色對其來講至關於一個客戶端而已。

具體實例對象

交易的保存,交易的保存涉及到交易自己數據庫表的保存、餘額的調整、交易修改備案的記錄等操做。接口

相關子類的代碼爲:string

/// <summary>
/// 交易保存類--子系統1
/// </summary>
class TradeManager
{
    public void SaveTrade(Trade aTrade)
    {
        Console.WriteLine("交易編號爲{0}的交易保存成功", aTrade.NO);
    }
}

/// <summary>
/// 交易修改備案類--子系統2
/// </summary>
public class TradeDiffManager
{
    public void DiffTrade(Trade aTrade)
    {
        Console.WriteLine("交易編號爲{0}的交易修改備案保存成功", aTrade.NO);
    }
}

/// <summary>
/// 交易餘額記帳類--子系統3
/// </summary>
public class TradeClearManager
{
    public void ClearTrade(Trade aTrade)
    {
        Console.WriteLine("交易編號爲{0}的交易餘額記帳成功", aTrade.NO);
    }
}

若是每一個客戶端保存交易時,每次都依次調用上述代碼,會使客戶端顯得累贅,代碼可讀性變差。it

代碼爲:class

public class ClientTest
{
    public static void Main(string[] args)
    {
        Trade trade = new Trade();
        trade.NO = 100;

        TradeManager tradeManager = new TradeManager();
        tradeManager.SaveTrade(trade);

        TradeDiffManager tradeDiffManager = new TradeDiffManager();
        tradeDiffManager.DiffTrade(trade);

        TradeClearManager tradeClearManager = new TradeClearManager();
        tradeClearManager.ClearTrade(trade);

        Console.ReadLine();
    }
}

使用外觀模式,將原本在客戶端依次調用的一組方法放在門面角色裏面統一處理。方法

代碼爲:通信

 

public class FacadeClass
  {
      public void SaveTrade(Trade aTrade)
      {
          TradeManager tradeManager = new TradeManager();
          tradeManager.SaveTrade(aTrade);

          TradeDiffManager tradeDiffManager = new TradeDiffManager();
          tradeDiffManager.DiffTrade(aTrade);

          TradeClearManager tradeClearManager = new TradeClearManager();
          tradeClearManager.ClearTrade(aTrade);
      }
  }

  public class ClientTest
  {
      public static void Main(string[] args)
      {
          Trade trade = new Trade();
          trade.NO = 100;

          FacadeClass facade = new FacadeClass();
          facade.SaveTrade(trade);

          Console.ReadLine();
      }
  }

補充分析

1.門面類(即上文中的FacadeClass)自己能夠不少個,針對不一樣用途,對子系統的各個方法進行組裝。

2.通常來講,門面類只有一個實例(上面爲了簡單起見,沒有把門面類定義爲Singleton)

3.門面類自己通常沒有實現代碼,只是爲各個子系統提供一個集中的調用接口。

優勢:

1.爲複雜的子系統提供一個簡單接口。

2.提供子系統的獨立性。子系統不須要知道門面類,門面類只是他的一個客戶端而已。子系統自己的方法也能夠直接供外面調用。

3.在層次化結構中,可使用外觀模式定義每一層的入口。

相關文章
相關標籤/搜索