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> ...
随机推荐
- 【Android进阶】SlidingMenu实现侧滑栏效果的实现
public class MainActivity extends Activity { @Override protected void onCreate(final Bundle savedIns ...
- bash构造tmux显示tmux ssh状态
要求: 于tmux内部链接ssh什么时候, 假设有多个ssh主机. 我们要显示相应的主机ip要显示筛查 实现效果 编辑你的bashrc, 由于我习惯在root下操作, 所以/root/.bashrc. ...
- PHP之运用CI用钩子实现URL权限控制————————【Badboy】
<span style="background-color: rgb(247, 252, 255); font-family: Verdana, Arial, Helvetica, s ...
- HDOJ 4974 A simple water problem
A simple water problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/O ...
- python字典构造函数dict(mapping)解析
Python字典的构造函数有三个,dict().dict(**args).dict(mapping),当中第一个.第二个构造函数比較好理解也比較easy使用, 而dict(mapping)这个构造函数 ...
- Python 实现类似PHP的strip_tags功能,并能够定义他们自己的一套保留标记
最近的研究 Python ,发现还是很习惯使用,多PHP这是非常easy该功能Python 这不得不找了半天,而且非常灵活不得不实现自己的. 我们今天聚集,需要过滤的内容标签,搞一个PM.外形似终于想 ...
- 设计管理员表;webservice用于网络安全的高端内提供服务的
admin表设计.你应该有角色表,管理员属于一个样的作用,另一个接口选项,以查看表.角色有更多的选择的能力. 角色和选项代表了许多关系,因此,我们必须保持这种关系有一个表 版权声明:本文博客原创文章, ...
- JavaScript权威指南科13章 webj浏览器avascript
13.1 clientjavascript window对象是所有clientjavascript特点和api主要的接入点.它代表了一个浏览器窗口,通过window对象引用它. window 方法 a ...
- SOA两个接口通常用于实现更:SOAP vs REST
SOA协作架构异构系统,因此,一个跨操作系统的需求.跨语言的通用信息交换格公式. SOAP和REST它们是基于消息正文文本,在跨平台方面相比二进制消息优点.因此,作为选择SOA实施通常用于界面.但SO ...
- android在当前app该文件下创建一个文件夹
/********************************************************************* * Author : Samson * Date ...