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)生活中的外观: 找电脑组装公司组装电脑; 通过中介来处理房屋的买卖。开学须要办理各种手续流程。能够找人代为处理;公司须要开发某款产品。市场部门负责市场调研、採购部门负责採购配件,开发科负责开发,此时,通过代表各个部门的处理活动导演。

版权声明:本文博主原创文章,博客,未经同意不得转载。

时间: 2024-10-28 20:58:08

C++外观设计模式模式(三)的相关文章

Java经典23种设计模式之结构型模式(三)------附代理模式、适配器模式、外观模式区别

本文介绍7种结构型模式里的剩下两种:享元模式.代理模式. 一.享元模式FlyWeight 享元模式比较简单且重要,在很多场合都被用到,只不过封装起来了用户看不到.其概念:运用共享内存技术最大限度的支持大量细粒度的对象.这个概念给的有些抽象,说白了就是如果内存中存在某个对象A,如果再次需要使用对象A的时候如果内存中有A这个对象就直接使用它,不要再次new了.如果没有,则重新new一个.基于这个特点,享元模式使用时一般会给待访问对象传递一个Tag,用来标识这个对象,而且要同时使用抽象工厂的方法进行访

C++设计模式之建造者模式(三)

4.引入钩子方法的建造者模式 建造者模式除了逐步构建一个复杂产品对象外,还可以通过Director类来更加精细地控制产品的创建过程,例如增加一类称之为钩子方法(HookMethod)的特殊方法来控制是否对某个buildPartX()的调用,也就是判断产品中某个部件是否需要被建造.钩子方法的返回类型通常为boolean类型,方法名一般为isXXX(),钩子方法定义在抽象建造者类中.在抽象建造者类中提供钩子方法的默认实现,具体建造者类如果不需要建造某个部件,则该建造者类覆盖抽象建造者类的钩子方法.

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

外观设计模式: 这个外观设计模式提供了一个单独的接口给复杂的子系统.而不是暴露用户的一组类和API,你仅仅暴露一个简单的同一的API. 下面的图片解释这个概念: API的用户根本不知道后面系统的复杂性.这种模式是理想的在处理大量的类,特别是当他们复杂的使用或者很难理解的时候. 这个外观设计模式使用系统的接口和你隐藏的实现来分离代码.他也减少了依赖外部代码的子系统运作.这也是有用的如果在外观设计模式的类可能会改变,外部类可以保留相同的API同时改变幕后的事情. 例如有一天你可能想替换你的服务器端,

设计模式(三) : 创建型模式--工厂方法模式

工厂方法模式区别与简单工厂模式主要在于,factory中对对象的实例化延迟到了子类的factory中, 这也是优于简单工厂的地方.下面看这个模式的类图(截自<java与模式>): 示意性代码: ? 1 2 3 4 5 6 7 package com.javadesignpattern.factorymethod; public interface Creator {          public Product fatcory(); } package com.javadesignpatte

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

Proxy(代理模式)和Facade(外观)设计模式它们均为更复杂的功能提供抽象化的概念,但这两种实现抽象化的过程大不相同 Proxy案例中,所有的方法和成员变量都来自于目标对象,必要时,该代理能够对它所传递的数据进行修改或检查魔术方法使得Proxy的实现变的简单,Proxy模式的一类应用时用来记录方法的访问信息还可以利用Proxy的类确定代码的范围或调试程序中存在的问题 <?php class LoggingProxy{ private $target; //传递进去一个对象 public f

Java设计模式(三)-装饰者模式

我们都知道,可以使用两种方式给一个类或者对象添加行为. 一是使用继承.继承是给一个类添加行为的比较有效的途径.通过使用继承,可以使得子类在拥有自身方法的同时,还可以拥有父类的方法.但是使用继承是静态的,在编译的时候就已经决定了子类的行为,我们不便于控制增加行为的方式和时机. 二是使用关联.组合即将一个对象嵌入到另一个对象中,由另一个对象来决定是否引用该对象来扩展自己的行为.这是一种动态的方式,我们可以在应用程序中动态的控制. 与继承相比,关联关系的优势就在于不会破坏类的封装性,且具有较好的松耦合

Java经典23种设计模式之行为型模式(三)

本文接着介绍11种行为型模式里的备忘录模式.观察者模式.状态模式. 一.备忘录模式 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以将该对象恢复到原先保存的状态.还是比较好理解的. 1.Memento 备忘录存储原发器对象的内部状态,这个类就是要存储的对象的状态.状态需要多少个变量,在Memento里就写多少个变量. public class Memento { private String state; public Meme*to(String st

设计模式(三): FACTORY工厂模式 -- 创建型模式

1.定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类. 2.适用场景 1.第一种情况是对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来.Java Collection中的iterator() 方法即属于这种情况. 2.第二种情况,只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给

Java设计模式(三)原型模式

(五)原型模式 Prototype 原型模式目的是复制一个现有对象来生成新的对象,而不是通过实例化的方式.原型模式需要实现 Cloneable 接口,覆写clone方法,复制分为浅复制.深复制. 浅复制:将一个对象复制后,基本数据类型的变量都重新创建,引用类型,指向的还是原对象所指向的. 深复制:讲一个对象复制后,不论基本数据类型和引用类型,都是重新创建,是完全的彻底的复制. public class ProtoType { public static void main(String[] ar