设计模式-外观模式(Facade)
简介
外观模式(Facade),将外部与内部子系统的通信通过一个统一的门面对象进行。
由两部分组成:
- 门面角色:供外部调用,内部可能组装了多个子系统,多个方法。
- 子系统角色:子系统的方法也可以直接供外部调用。一般来说,将常用的方法放在门面角色里面调用,门面角色对其来说相当于一个客户端而已。
具体实例
交易的保存,交易的保存涉及到交易本身数据库表的保存、余额的调整、交易修改备案的记录等操作。
相关子类的代码为:
/// <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.在层次化结构中,可以使用外观模式定义每一层的入口。
设计模式-外观模式(Facade)的更多相关文章
- C#设计模式——外观模式(Facade Pattern)
一.概述 在系统设计中,某一个系统可能非常庞大,用户要使用该系统就不得不掌握大量的接口,造成使用的不便.这时可以考虑将该系统细分成一系列子系统并使子系统间的耦合降到最低,利用外观模式提供一个外观对象, ...
- 大话设计模式--外观模式 Facade -- C++实现实例
1. 外观模式: 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这个子系统更加容易使用. 外观模式的使用场合: A: 设计初期阶段,应该要有意识的将不同的两个层分离. ...
- 设计模式--外观模式Facade(结构型)
一.外观模式 外观模式提供了一个统一的接口,用来访问子系统中的一群接口.外观模式定义了一个高层接口,让子系统更容易被使用. 二.UML图 三.例子 举个编译器的例子,假设编译一个程序需要经过四个步骤: ...
- 【转】设计模式(九)外观模式Facade(结构型)
设计模式--外观模式Facade(结构型): 1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性. ...
- 设计模式(九)外观模式Facade(结构型)
设计模式(九)外观模式Facade(结构型) 1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性. ...
- 乐在其中设计模式(C#) - 外观模式(Facade Pattern)
原文:乐在其中设计模式(C#) - 外观模式(Facade Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 外观模式(Facade Pattern) 作者:webabcd 介绍 ...
- 设计模式(二)-- 外观模式(Facade)
设计模式(二) 外观模式(Facade) 为了解决子系统外部的客户端在使用子系统的时候,既能简单地使用这些子系统内部的模块功能,而又不用客户端去与子系统内部的多个模块交互的问题. 为子系统中的一组接口 ...
- 8.4 GOF设计模式三: 外观模式 Facade
GOF设计模式三: 外观模式 Facade “现有系统”功能强大.复杂,开发“新系统”需要用到其中一部分,但又要增加一部 分新功能,该怎么办?4.1 Facade Pattern: Key Fea ...
- 设计模式系列之外观模式(Facade Pattern)——提供统一的入口
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
随机推荐
- Move Zeroes
https://leetcode.com/problems/move-zeroes/ Given an array nums, write a function to move all 0's to ...
- flexpaper源码的编译,去除logo和打印 (转)
1.首先下载FlexPaper的源码.下载地址 2. 下载Adobe Flash Builder v4.5 现在最新是4.6了,在adobe网站木找到4.5下载,这里提供下4.5的种子文件 http: ...
- centos6.4添加fedora-epel源
1. 去sohu镜像下载epel-release-6包 并安装.#wget http://mirrors.sohu.com/fedora-epel/6/x86_64/epel-release-6-8. ...
- [ActionScript] AS3 绘制虚线
import flash.geom.Point; import flash.display.MovieClip; import flash.display.Graphics; function dra ...
- Gradle简介
gradle跟ant/maven一样,是一种依赖管理/自动化构建工具.但是跟ant/maven不一样,它并没有使用xml语言,而是采用了Groovy语言,这使得它更加简洁.灵活,更加强大的是,grad ...
- CentOS 6 安装 Python3.5以及配置Django
http://www.jianshu.com/p/6199b5c26725 文/FiveStrong(简书作者)原文链接:http://www.jianshu.com/p/6199b5c26725著作 ...
- [HDU 1114] Piggy-Bank (动态规划)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1114 简单完全背包,不多说. #include <cstdio> #include < ...
- ibatis cannot find <sql> pattern
"Could not find SQL statement to include with refid xxx"A: 认真把每个用到xxx的地方都看一遍
- 海外支付:抵御信用卡欺诈的CyberSource
海外支付:抵御信用卡欺诈的CyberSource 吴剑 2014-06-04 原创文章,转载必需注明出处:http://www.cnblogs.com/wu-jian 吴剑 http://www.cn ...
- 笔记本win7制作wifi
笔记本win7系统, 要打开笔记本无线网卡 1. 运行 netsh wlan set hostednetwork mode=allow ssid=testwifi key=testpass model ...