C++外观设计模式模式(三)
3、外观模式总结
引入了外观类。解除了客户类与子系统的耦合性。客户类不须要直接操作子系统,而是由外观类负责处理,对client而言是透明的,客户类仅仅须要操作外观类就能够了,符合"迪迷特法则"。假设多个地方须要Facade。也就是说外观能够实现功能的共享,也就是实现复用。相同的调用代码仅仅用在Facade里面写一次就好了。不用在多个调用的地方反复写。假设某个系统模块须要改动。仅仅须要改动这个系统模块就能够了,对client无影响,维护性好。另一个潜在优点。对使用Facade的人员来说,Facade节省了他们的学习成本。他们仅仅须要了解Facade就可以。无需深入到子系统内部,去了解每一个模块的细节,也不用和多个模块交互。从而使得开发简单,学习也easy。
如今的系统是越做越大。越来越复杂,对软件的要求也越来越高。为了提高系统的可重用性,一般会把一个大的系统分为多个子系统。再把一个子系统分成非常多更小的子系统,一直分下去,分到一个个小的模块。这样一来子系统的重用性就会得到加强。
但这也带来一个问题。因为模块添加,对象之间的耦合性也随之增强了。外观模式能够解决问题,由外观来对各个子模块子系统进行处理,client仅仅须要操作外观就能够了。
通常在三层架构中就须要考虑在数据訪问层和业务逻辑层、业务逻辑层和UI层的层与层之间建立外观Facade,这样能够为复杂的子系统提供一个简单的结构。使得耦合大大减少。
比如:在UI层定义一个外观对象。外观负责相应用层的子系统进行处理,当UI层有请求时,通过UI层的外观托付给应用层的子系统进行处理。相同能够在应用层定义一个外观对象。当应用层请求对数据进行处理的时候。通过应用层的外观托付给数据层中的模块对数据进行处理。
1.外观模式长处
外观模式的主要长处例如以下:
(1) 它对client屏蔽了子系统组件。降低了client所需处理的对象数目。并使得子系统使用起来更加容易。通过引入外观模式,client代码将变得非常easy,与之关联的对象也非常少。符合“迪米特法则”。
(2) 它实现了子系统与client之间的松耦合关系,这使得子系统的变化不会影响到调用它的client,仅仅须要调整外观类就可以。
(3) 一个子系统的改动对其它子系统没有不论什么影响,并且子系统内部变化也不会影响到外观对象。
(4)外观对象负责对子系统进行处理,假设某个子系统进行了改动,可能仅仅须要改动外观对象就能够了,维护性好。
假设没有使用外观对象,则某个子系统进行了改动,则假设有多个client使用到这个子系统。则这些client都得进行改动,维护性差。
(5)多个client能够复用外观Facade,复用性好。
(6)符合多用组合少用继承原则。
2.外观模式缺点
外观模式的主要缺点例如以下:
(1) 不能非常好地限制client直接使用子系统类,假设对client訪问子系统类做太多的限制则降低了可变性和灵活 性。
(2) 假设设计不当,添加新的子系统可能须要改动外观类的源码,违背了开闭原则。
3. 外观模式适用场景
(1) 当要为訪问一系列复杂的子系统提供一个简单入口时能够使用外观模式。
(2) client程序与多个子系统之间存在非常大的依赖性。
引入外观类能够将子系统与client解耦。从而提高子系统的独立性和可移植性。
(3) 在层次化结构中,能够使用外观模式定义系统中每一层的入口,层与层之间不直接产生联系。而通过外观类建立联系,减少层之间的耦合度
4.外观模式详细应用
(1)邮件业务系统的开发: 发信人仅仅须要把发送内容,接收地址告诉邮局。邮局系统代为发送处理。
邮局系统充当外观角色。
(2)绝大多数系统都有一个首页或者导航页面。同一时候也提供了菜单或者工具栏。在这里,首页和导航页面、菜单和工具栏就是外观角色,通过它们用户能够高速訪问子系统,减少了系统的复杂程度。
(3)KTV点歌系统的开发: 提供一个外观用来处理显示器模块、音响模块、灯光模块操作。
(4)文件安全传送模块开发: 存在三个模块,读取文件内容模块,对文件内容进行加密模块和写入文件模块。提供一个外观,对这些模块进行处理。
(5)在三层架构中,UI层和业务逻辑层提供一个外观。业务逻辑层和数据訪问层提供一个外观。这样能够为复杂的子系统提供一个简单的结构。
(6)车票订购系统的开发: 顾客仅仅须要到售票窗体,购买所须要的火车票。汽车票、飞机票。
由售票窗体统一处理。
(7)医疗系统的开发: 眼下须要挂号、缴费、取药等流程。能够定义一个外观,让外观处理这些流程。
(8)Windows开机启动程序: 应用程序能够双击开启,也能够由Winodws代为处理,windows开机自己主动执行应用程序。这个时候,Windows系统就是一个外观。
(9)游戏充值系统的开发: 须要推断账号是否存在模块,推断库存是否充足模块,充值模块。
提供一个外观负责和这三个模块打交道。
(10)生活中的外观: 找电脑组装公司组装电脑; 通过中介来处理房屋的买卖。开学须要办理各种手续流程。能够找人代为处理;公司须要开发某款产品。市场部门负责市场调研、採购部门负责採购配件,开发科负责开发,此时,通过代表各个部门的处理活动导演。
版权声明:本文博主原创文章,博客,未经同意不得转载。
C++外观设计模式模式(三)的更多相关文章
- IOS设计模式第三篇之外观设计模式
外观设计模式: 这个外观设计模式提供了一个单独的接口给复杂的子系统.而不是暴露用户的一组类和API,你仅仅暴露一个简单的同一的API. 下面的图片解释这个概念: API的用户根本不知道后面系统的复杂性 ...
- 小菜学习设计模式(三)—工厂方法(Factory Method)模式
前言 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Method) ...
- Java设计模式(三) 抽象工厂模式
原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...
- 设计模式--外观(Facade)模式
Insus.NET在去年有写过一篇<软件研发公司,外观设计模式(Facade)>http://www.cnblogs.com/insus/archive/2013/02/27/293606 ...
- php设计模式之Proxy(代理模式)和Facade(外观)设计模式
Proxy(代理模式)和Facade(外观)设计模式它们均为更复杂的功能提供抽象化的概念,但这两种实现抽象化的过程大不相同 Proxy案例中,所有的方法和成员变量都来自于目标对象,必要时,该代理能够对 ...
- PHP设计模式(三)抽象工厂模式(Abstract Factory)
一.什么是抽象工厂模式 抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足以下条件: 系统中有多个产品族,而系统一次只可能消费其中一族产品. 同 ...
- 设计模式系列之工厂模式三兄弟(Factory Pattern)
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- ASP.NET 设计模式分为三种类型
设计模式分为三种类型,共23类. 一.创建型模式:单例模式.抽象工厂模式.建造者模式.工厂模式.原型模式. 二.结构型模式:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代 ...
- 外观/门面模式(Facade)
2015/4/28 外观/门面模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. #include <vector> ...
随机推荐
- JavaWeb-11 (JSP&EL表达)
JavaWeb-11 JSP&EL表达式 JSP 四.JSP语法(学好的关键:相应的Servlet) JavaWeb-10 总结:session技术也是cookie的一种.server给浏览器 ...
- NET MVC过滤器
NET MVC过滤器 本系列目录:ASP.NET MVC4入门到精通系列目录汇总 在ASP.NET MVC中有四种过滤器类型
- jedis异常:NoSuchElementException: Timeout waiting for idle object
项目发现网络环境:java.util.NoSuchElementException: Timeout waiting for idle object 问题原因:不应该在try中释放资源.而应该在fin ...
- 新版本NDK环境结构(避Cygwin,超快)
曾经做Android的项目要用到NDK就必需要下载NDK,下载安装Cygwin(模拟Linux环境用的),下载CDT(Eclipse C/C++开发插件),还要配置编译器,环境变量... 麻烦到不想说 ...
- UVA 11174 Stand in a Line 树dp+算
主题链接:点击打开链接 题意:白书的P103. 加个虚根就能够了...然后就是一个多重集排列. import java.io.PrintWriter; import java.util.ArrayLi ...
- 构造activeMQ
一.添加下列库 而配置的路径 ws2_32.lib;Mswsock.lib;cppunit.lib;libapr-1.lib;libapriconv-1.lib;libaprutil-1.lib;li ...
- Oracle 11g oracle客户端(32位)PL/SQL develepment的安装配置
Oracle 11g+oracle客户端(32位)+PL/SQL develepment的安装配置 之前一直想学Oracle,可是就是安装配置Oracle一直未成功,让人很苦恼,特别是什么监听器什么的 ...
- AsyncTask来源分析(一)
于android开发过程AsyncTask我会经常处理它.在网上,也有很多的其描述,因此,这里是不是说的用法,直接写自己的学习经验,以及它的一些浅显的认识,忘记错批评. AsyncTask它是一个抽象 ...
- 使用iframe从网页调起移动端应用
比如想在网页中调起支付宝,我们可以创建一个iframe,src为: alipayqr://platformapi/startapp?saId=10000007&clientVersion=3. ...
- 排序(4)---------希尔(shell)排序(C语言实现)
由于考试耽搁了几天,不好意思~~~ 前面的介绍的三种排序算法,都属于简单排序,大家能够看下详细算法,时间复杂度基本都在0(n^2),这样呢,非常多计算机界.数学界的牛人就非常不爽了,他们在家里想啊想, ...