设计模式-外观模式(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:/ ...
随机推荐
- linux常用命令 3
示例定义的 mytest或者test 用户 mygroup 用户组 cat /etc/group 查看组 groupname:x:groupId:其他成员 组名:x(加密):组ID:组成员cat /e ...
- Airbnb面试的27个奇葩问题,你 hold 住吗?
Airbnb 目前估值 255 亿美金,排名世界科技公司第三.但如果你想去他家工作,可能首先需要回答一些很棘手的问题. 以下,是 BI 通过 Glassdoor 信息收集到的:曾经历 Airbnb 面 ...
- 九度OJ1077
#include <stdio.h> #include<stdlib.h> //最大子序列和问题,动态规划,公式为d(n)=max{d(n-1),0}+A[i] typedef ...
- Codeforces 404D [DP]
/* 我是一个习惯后悔,但是没办法忍受内疚感的二货== 这题是个无脑dp,但是比赛大概20min没出...其实最后5min我好好想想简单化边界条件,可以出的. 题意: 给你一个长度为1e6的由?*01 ...
- poj 2240 Arbitrage bellman-ford算法
点击打开链接 Arbitrage Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13434 Accepted: 5657 ...
- [ZOJ 3662] Math Magic (动态规划+状态压缩)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3662 之前写过这道题,结果被康神吐槽说代码写的挫. 的确,那时候 ...
- (转)C#精确时间计时器
原文地址:http://blog.sina.com.cn/s/blog_699d3f1b01012vgb.html 1 调用WIN API中的GetTickCount [DllImport(" ...
- HDU 4390 Number Sequence 容斥原理
Number Sequence Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- <iOS>other linker flags[转]
包含静态库时候需要在Target的Other linker flags里面加上值:-objC,-all_load,-force_load 对于64位机子和iPhone OS应用 解决方法是使用-all ...
- 消除PyCharm中满屏的波浪线
PyCharm使用了较为严格的PEP8的检查规则,如果代码命名不规范,甚至多出的空格都会被波浪线标识出来,导致整个编辑器里铺满了波浪线,右边的滚动条也全是黄色或灰色的标记线,很是影响编辑. 在网上看了 ...