设计模式-外观模式(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:/ ...
随机推荐
- git 常用命令 (git did not exit cleanly)
Git常用操作命令收集: git clonegit git remote -v git remote add [name] [url] git remote rm [name] git remote ...
- Porlet标准:JSR168/JSR286/WSRP(转载)
From:http://www.iteye.com/topic/620213 Portlet标准主要是JSR168,JSR286和WSRP. JSR168因为比较早,所以大部分的Portal都支持这个 ...
- storyBoard中切换应用启动的切入点方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launc ...
- 客户端获取服务端自定义类数据 z
客户端获取服务端自定义类数据 问题一:超时问题,在最后获取数据的时候突然提示服务超时,服务已断开 解决:配置文件添加: <bindings> <wsHttpBinding> & ...
- 表空间、Schema和用户
源地址:http://www.cnblogs.com/kevinanni/p/3688921.html
- 20145305 《Java程序设计》实验一
实验名称 实现凯撒密码,并进行测试. 实验内容 它是一种代换密码.据说凯撒是率先使用加密函的古代将领之一,因此这种加密方法被称为恺撒密码. 凯撒密码作为一种最为古老的对称加密体制,在古罗马的时候都已经 ...
- 把Nginx加为系统服务(service nginx start/stop/restart)
1.编写脚本,名为nginx #!/bin/sh # # nginx - this script starts and stops the nginx daemon # # chkconfig: - ...
- [ActionScript 3.0] as3.0加载as2.0的swf时获取as2.0的实际舞台尺寸
var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.INIT, initHandler) ...
- eclipse中debug
在需要测试的代码行左侧行号列上双击,生成断点 ,再次双击可以取消断点 如图: 然后右键,选择Debug As-Java Application,(注意,不是选择Run As) 开始调试java ...
- RDLC报表分页显示标题
将报表以 XML的方式打开,搜索找到“详细信息” 在这个位置 <TablixRowHierarchy> <TablixMembers> <TablixMember> ...