设计模式-外观模式(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:/ ...
随机推荐
- error-iis-Service Unavailable
Service Unavailable Service Unavailable HTTP Error 503. The service is unavailable.
- 更新nvm
在官方看到这个文档 ( cd "$NVM_DIR" git fetch origin git checkout `git describe --abbrev=0 --tags -- ...
- ruby api 2.1新增改变
-> 这个符号可以替换lambda%i 生成符号数组 %i(foor bar baz) #[:foo,:bar:baz]def 定义方法 eg: def foo(x: 1); puts; end ...
- C++学习50 对字符串流的读写
文件流是以外存文件为输入输出对象的数据流,字符串流不是以外存文件为输入输出的对象,而以内存中用户定义的字符数组(字符串)为输入输出的对象,即将数据输出到内存中的字符数组,或者从字符数组(字符串)将数据 ...
- ArcGIS上根据经纬度求地球表面两点间距离的实现
ArcGIS上根据经纬度求地球表面两点间距离的实现 以米为单位..Net2.0,C#实现. public static double DistanceOfTwoPoints(double ...
- 第一次听到了docker
1.今天工作中,同时要我给应用申请3个docker,因为之前是一直在做开发,部署就在tomcat里面测试,下来搜素了一下,发现docker和maven类似,不过docker是环境的一个快照,因为之前开 ...
- ORA-04031 With Leak in "OBJ STAT MEMO" Allocations Seen in V$SGASTAT on 10.2.0.5 (文档 ID 1350050.1)
APPLIES TO: Oracle Server - Enterprise Edition - Version: 10.2.0.5<max_ver> and later [Relea ...
- 制作东皇3.2的安装U盘-黑苹果之路
每次使用硬盘映像安装需要先装windows,制作东皇3.2安装分区,再装bootthink,再通过bootthink加载东皇3.2的分区进行安装,非常繁琐.尝试制作U盘来直接安装东皇3.2.过程如下: ...
- jdk线程的生产者消费者问题
同步代码块实现生产者消费者模式 class Person { private String name; private String sex; private Boolean isEmpty = Bo ...
- nearly,about,almost的区别
nearly 几乎,将近almost 几乎,差一点儿就,差不多(与动词,副词,形容词以及名词连用时,可与nearly通用;与no,none,nothing,never等否定式连用时,不可与nearly ...