三分钟理解“外观模式”——设计模式轻松掌握

实际生活中的例子:

现在流行炒股,股民一般都手持好多个股票,而股民每天需要关注手中N个股票的动向,随时针对不同的股票作出不同的决策,这样感觉心好累;于是有的人选择买基金。基金本质上还是炒股票,只不过基金机构拿了投资人的钱买了N个股票,而我们只要购买一个基金就够了,对N个股票的管理就交给基金机构去折腾了,我们瞬间感觉好轻松。

代码世界也是一样,每个股票都是一个类,每个基金都是一个类,股民就是这些类的使用者。如果股民直接操作多个股票类,那会导致股民类中的操作非常复杂,那么股民类和整个系统的藕合度也就很高。如果引入一个基金类,对股票类的操作全都由基金类来完成,股民类只需要与基金类交互即可,这样就大大降低了股民类的复杂度,降低了股民类和系统之间的藕合度。

外观模式的类图:

现在有好多个子系统,他们都有对外的接口,如果让客户端直接与这些子系统交互,那么客户端代码会过于复杂;这时候引入一个外观类,用于处理与各个子系统之间的交互,客户端只需调用外观类简单的接口即可操作各个子系统。

外观模式在MVC中的运用:

MVC模式将整个系统分成Action层、Service层、DAO层。Action层就相当于客户端,Service层就相当于外观类,DAO层就相当于各个子系统。

如果没有Service层,那么Action要直接与DAO交互;我们知道,一个功能可能需要多个DAO中的函数实现,那么这会导致Action中的代码过于复杂。所以我们在Action层和DAO层中间引入了Service层,将DAO层复杂的功能封装在Service层的函数中,Service层给Action层提供一系列简单的接口,这使得Action层的代码简单清晰。

何时使用外观模式?

1.在系统设计的阶段,就要使用MVC模式,将Action、Service、DAO层分离开,这样可以为复杂的DAO层的操作提供一个简单的接口,使得Action与DAO之间的藕合度大大降低。

2.在开发阶段,子系统会因不断地重构演化而变的越来越复杂;并且大多数的设计模式也会产生很多小类,这是好事,但也给外部调用他们的用户程序带来了使用上的困难。增加外观类可以给用户程序提供一个简单的接口,减少他们之间的依赖。

3.在维护时期,如果维护一个遗留的大型系统时,可能这个系统已经到了非常难以扩展和维护的地步了,但这个系统中包含了重要的功能我们必须使用它,如果直接调用这些功能可能会导致客户程序非常复杂,所以我们可以使用一个外观类,给复杂的遗留代码提供一个简单清晰的外部接口。

外观模式的官方定义:

为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

外观模式的官方定义:

为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-27 03:31:19

三分钟理解“外观模式”——设计模式轻松掌握的相关文章

三分钟理解“原型模式”——设计模式轻松掌握

原型模式的官方定义: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 大白话: 现在有一个类,它要产生大量的对象,而且这些对象中的属性值大部分都相同:如果我们要获取这样一个对象的时候每次都通过new,然后再set每一个属性值,那么这样就太麻烦了.这种情况下使用原型模式非常便捷: 我们让这个类去实现ICloneable接口,并且实现该接口的clone()函数,在clone函数中让当前对象进行一次浅拷贝/深拷贝,总之就是克隆一个当前对象来,这样我们就无需new完了对象后再逐个set

三分钟理解“模板方法模式”——设计模式轻松掌握

模板方法模式的官方定义: 在模板方法模式中,只定义一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤. 大白话讲: 当一个函数的流程都能够确定,但某些具体的步骤会根据情况的不同而不同.此时可以使用模板方法模式,将函数中能确定的部分都写出来,不确定的部分用本类中的抽象函数代替:当需要使用该函数时,需要创建一个实现该类中所有抽象函数的子类,当通过子类调用该算法时,当执行到算法中的抽象函数时,由于多态的特性,系统会自动调用子类中已经重写好

三分钟理解“工厂模式”——设计模式轻松掌握

举个例子 假设需要我们写一个简单的计算器,能实现加减乘除运算,仅要求输入两个数,选择运算符,计算出结果就行了. 使用简单工厂模式的设计如下: 工厂类提供了一个getBean函数,该函数会根据客户端输入的key来判断究竟new运算类的哪一个子类对象. 简单工厂模式的弊端: 当需要增加计算器的功能时,比如要增加一个开根号的功能,那么首先需要创建一个开根号子类,继承运算类,并实现operation函数: 除此之外,还需要修改工厂类,在getBean函数中增加对开根号的判断. 也就是说,简单工厂模式在增

三分钟理解“策略模式”——设计模式轻松掌握

实际问题: 由于超市隔三差五就要办促销活动,但每次促销活动的方式不一样,所以需要开发一个软件,营业员只要输入原价再选择活动类型后,就能计算出折扣以后的价钱. 普通人的做法: mian(){ String input = readLine(); double price = readLine(); switch (input) case "九五折": price = price * 0.95; break; case "满100返50": if(price>=1

三分钟理解“建造者模式”——设计模式轻松掌握

"建造者模式"生活中的例子: 肯德基做汉堡的过程都是有严格的规范的,不管是麦香鸡腿堡还是新奥尔良烤鸡腿堡,他们的制作步骤都是有严格规定,做汉堡的人既不能多做一步,也不能少做一步.对于不同的汉堡来说,虽然每一步加的料所有不同,但做汉堡的步骤都是一样的.因为有了对做汉堡过程的严格控制,因而全国所有的肯德基店做出来的汉堡味道都是一样的. 这些汉堡就是一个个对象,刚被创建出来的时候它就是两片面包片,没有任何内容:然后我们把它扔到一个流水线上,这个流水线会按照指定的步骤往汉堡对象中逐步添加材料:

用三分钟理解c语言sizeof

一.概念 sizeof是单目操作符,同++等操作符一样.作用是以字节形式输出操作对象所在储存大小. 二.用法 a.操作数据类型 如sizeof(int),输出int类型在内存中所占的字节长度,具体取决于具体环境,本机输出为4. b.操作变量 如 char a[6]; printf("%d\n" ,sizeof(a)),因为已经定义了char数组长度,所以输出值为6. 三.常见问题 有以下几个例子,需要引起注意: 例子1: int testSizeOf(char x[]) { retur

三分钟理解“享元模式”——设计模式轻松掌握

享原模式的官方定义: 运用共享技术有效地支持大量细粒度的对象. 大白话讲: 一个类它可能生成好多对象,但这些对象根据属性值的不同一共分成N类,每种类型中属性值都是一样的.在这种情况下,如果创建好多对象,那么这些对象中很多属性值都是重复的,从而造成了大量的内存浪费. 而享元模式能够解决重复对象的内存浪费的问题. 享元模式使用一个工厂类,在工厂类中为每种类型创建一个对象,而且每种类型的对象只有一个. 当客户端需要某种类型的对象的时候,工厂将已创建好的对象给客户端.由于不创建新的对象了,所以节省了内存

三分钟掌握“迭代器模式”——轻松搞定设计模式

迭代器模式的官方定义: 迭代器模式提供了一种方法,它能够顺序访问一个集合对象中的各个元素,并且又不暴露该对象的内部结构. 不使用迭代器模式实现容器的迭代: 当我们拿到一个含有集合的对象时,如果我们想要遍历对象中的集合,就必须要知道对象的内部结构,然后使用for循环遍历对象中的集合.而且当我们需要换一种遍历方式的时候(如:顺序遍历换成逆序遍历),需要修改客户端的代码,这就违背了"封闭-开放原则".但如果使用了迭代器模式之后,需要换迭代方式时,只需要增加一个迭代器类,然后稍微修改一下集合对

漫谈设计模式--3分钟理解桥接模式:笔和画的关系

其实不需要3分钟,3秒钟就够了,记住桥接模式就是如此简单:一句话,笔有千般形,画有万变化. 下面的仅仅助于理解. 1. 定义 The bridge pattern is a design pattern used in software engineering which is meant to "decouple an abstraction from its implementation so that the two can vary independently" From Wi