zoukankan      html  css  js  c++  java
  • 设计模式-外观模式(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.在层次化结构中,可以使用外观模式定义每一层的入口。

  • 相关阅读:
    11
    10
    09
    08
    201621044079韩烨软件工程作业三
    软工作业二 201621044079韩烨
    软工作业一 201621044079韩烨
    14
    201621044079 week13 网络
    week12 201621044079 流与文件
  • 原文地址:https://www.cnblogs.com/liaozh/p/3397242.html
Copyright © 2011-2022 走看看