设计模式-外观模式(Facade)

简介

外观模式(Facade),将外部与内部子系统的通信通过一个统一的门面对象进行。

由两部分组成:

  1. 门面角色:供外部调用,内部可能组装了多个子系统,多个方法。
  2. 子系统角色:子系统的方法也可以直接供外部调用。一般来说,将常用的方法放在门面角色里面调用,门面角色对其来说相当于一个客户端而已。

具体实例

交易的保存,交易的保存涉及到交易本身数据库表的保存、余额的调整、交易修改备案的记录等操作。

相关子类的代码为:

/// <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);
    }
}

如果每个客户端保存交易时,每次都依次调用上述代码,会使客户端显得累赘,代码可读性变差。

代码为:

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

原文地址:https://www.cnblogs.com/liaozh/p/3397242.html