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

  • 相关阅读:
    PreparedStatementUpdateTest.java
    JDBCUtils.java
    StringTest.java
    创建线程的方式四:使用线程池
    用递归实现解决斐波那契数列。
    反射的用处。Class对象的介绍,怎么通过反射创建实例和调用方法。
    基于jenkins+docker+git 持续化自动部署项目(详细版一));
    git常用命令,linus的神作之一。
    电话号码的字母组合。(每天一道,防止痴呆)
    编写一个函数来查找字符串数组中的最长公共前缀。(每天一道防止痴呆)
  • 原文地址:https://www.cnblogs.com/liaozh/p/3397242.html
Copyright © 2011-2022 走看看