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++外观设计模式模式(三)的更多相关文章

  1. IOS设计模式第三篇之外观设计模式

    外观设计模式: 这个外观设计模式提供了一个单独的接口给复杂的子系统.而不是暴露用户的一组类和API,你仅仅暴露一个简单的同一的API. 下面的图片解释这个概念: API的用户根本不知道后面系统的复杂性 ...

  2. 小菜学习设计模式(三)—工厂方法(Factory Method)模式

    前言 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Method) ...

  3. Java设计模式(三) 抽象工厂模式

    原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...

  4. 设计模式--外观(Facade)模式

    Insus.NET在去年有写过一篇<软件研发公司,外观设计模式(Facade)>http://www.cnblogs.com/insus/archive/2013/02/27/293606 ...

  5. php设计模式之Proxy(代理模式)和Facade(外观)设计模式

    Proxy(代理模式)和Facade(外观)设计模式它们均为更复杂的功能提供抽象化的概念,但这两种实现抽象化的过程大不相同 Proxy案例中,所有的方法和成员变量都来自于目标对象,必要时,该代理能够对 ...

  6. PHP设计模式(三)抽象工厂模式(Abstract Factory)

    一.什么是抽象工厂模式 抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足以下条件: 系统中有多个产品族,而系统一次只可能消费其中一族产品. 同 ...

  7. 设计模式系列之工厂模式三兄弟(Factory Pattern)

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  8. ASP.NET 设计模式分为三种类型

    设计模式分为三种类型,共23类.  一.创建型模式:单例模式.抽象工厂模式.建造者模式.工厂模式.原型模式.      二.结构型模式:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代 ...

  9. 外观/门面模式(Facade)

    2015/4/28 外观/门面模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. #include <vector> ...

随机推荐

  1. TestNg显示器(一个)-----监听器,类型和配置使用---另外META-INF详细解释

    原创文章,版权所有所有.转载,归因:http://blog.csdn.net/wanghantong/article/details/40404939 TestNg提供了听众和拦截多种接口开发我们自己 ...

  2. CCProgressTo 和CCProgressTimer

    在cocos2d中相同提供了非常多表现图片和精灵的方式,上一篇其中提到的切换场景的方式之中的一个是顺或逆时针切入的方法,在图片上也能够使用,test里有一个样例介绍CCProgressTimer能够实 ...

  3. WWDC 2014 Session 205/217 Extension 注意事项

    基于阅读下面的内容205和217的PDF做笔记.没有深入研究. 205 Creating Extensions for iOS and OS X, Part 1 217 Creating Extens ...

  4. 阿里云OSS Multipart Upload上传实例

    原来是用的PutObject()方式上传文件的,但是当文件比较大的时候,总是报一个对方强制关闭连接导致上传失败.PS:公司的网比较渣,10MB的文件都传不上去,搜了下,说使用Multipart Upl ...

  5. 一起写2048(160行python代码)

    前言: Life is short ,you need python. --Bruce Eckel 我与2048的缘,不是缘于一个玩家.而是一次,一次,重新的ACM比赛.四月份校赛初赛,第一次碰到20 ...

  6. phpcmsv9更改fckeditor编者ueditor编辑

    于phpcmsv9文件夹中找到phpcms/libs/classes/form.class.php档 找到几行代码 <span style="font-size:18px;" ...

  7. C# DateTime结构的常用方法

    在项目开发中,经常会碰到日期处理.比如查询中,可能会经常遇到按时间段查询,有时会默认取出一个月的数据.当我们提交数据时,会需要记录当前日期,等等.下面就看看一些常用的方法. 首先,DateTime是一 ...

  8. ASP.Net中上传文件的几种方法

    在做Web项目时,上传文件是经常会碰到的需求.ASP.Net的WebForm开发模式中,封装了FileUpload控件,可以方便的进行文件上传操作.但有时,你可能不希望使用ASP.Net中的服务器控件 ...

  9. 新秀学习SSH(十四)——Spring集装箱AOP其原理——动态代理

    之前写了一篇文章IOC该博客--<Spring容器IOC解析及简单实现>,今天再来聊聊AOP.大家都知道Spring的两大特性是IOC和AOP. IOC负责将对象动态的注入到容器,从而达到 ...

  10. ArcGIS for Silverlight 地图卷帘

    原文:ArcGIS for Silverlight 地图卷帘 ArcGIS 地图卷帘 for Silverlight 地图卷帘,其实就是遮罩的效果,在Silverlight里实现这样的效果,对于熟悉S ...