设计模式-外观模式(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.在层次化结构中,可使用外观模式定义每一层的入口。

相关文章
相关标签/搜索