![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
设计模式
徐小hi
爱笑,性格开朗的人
展开
-
设计模式23--Interpreter模式(解释器模式)---行为型模式
一些应用提供了内建(Build-In)的脚本或者宏语言来让用户可以定义他们能够在系统 中进行的操作。Interpreter 模式的目的就是使用一个解释器为用户提供一个一门定义语言的 语法表示的解释器,然后通过这个解释器来解释语言中的句子。 Interpreter 模式提供了这样的一个实现语法解释器的框架,笔者曾经也正在构建一个编 译系统 Visual CMCS,现在已经发布了 Vis...原创 2019-10-21 16:14:36 · 186 阅读 · 0 评论 -
设计模式13--Template模式(模板方法模式)---行为型模式
在面向对象系统的分析与设计过程中经常会遇到这样一种情况:对于某一个业务逻辑 (算法实现)在不同的对象中有不同的细节实现,但是逻辑(算法)的框架(或通用的应用 算法)是相同的。Template 提供了这种情况的一个实现框架。 Template 模式是采用继承的方式实现这一点:将逻辑(算法)框架放在抽象基类中,并 定义好细节的接口,子类中实现细节。【注释 1】 【注释 ...原创 2019-08-15 14:41:05 · 155 阅读 · 0 评论 -
设计模式14--Strategy模式(策略模式)---行为型模式
Strategy 模式和 Template 模式要解决的问题是相同(类似)的,都是为了给业务逻辑(算 法)具体实现和抽象接口之间的解耦。Strategy 模式将逻辑(算法)封装到一个类(Context) 里面,通过组合的方式将具体算法的实现在组合对象中实现,再通过委托的方式将抽象接口 的实现委托给组合对象实现。State 模式也有类似的功能,他们之间的区别将在讨论中给出。 ...原创 2019-08-15 14:53:30 · 173 阅读 · 0 评论 -
设计模式15--State模式(状态模式)---行为型模式
每个人、事物在不同的状态下会有不同表现(动作),而一个状态又会在不同的表现下 转移到下一个不同的状态(State)。最简单的一个生活中的例子就是:地铁入口处,如果你 放入正确的地铁票,门就会打开让你通过。在出口处也是验票,如果正确你就可以 ok,否 则就不让你通过(如果你动作野蛮,或许会有报警(Alarm),:))。 有限状态自动机(FSM)也是一个典型的状态不同,对...原创 2019-08-15 15:03:06 · 215 阅读 · 0 评论 -
设计模式16--Observer模式(观察者模式)---行为型模式
Observer 模式应该可以说是应用最多、影响最广的模式之一,因为 Observer 的一个实 例 Model/View/Control(MVC)结构在系统开发架构设计中有着很重要的地位和意义,MVC 实现了业务逻辑和表示层的解耦。个人也认为 Observer 模式是软件开发过程中必须要掌握 和使用的模式之一。在 MFC 中,Doc/View(文档视图结构)提供了实现 MVC ...原创 2019-08-15 15:17:08 · 158 阅读 · 0 评论 -
设计模式17--Memento模式(备忘录模式)---行为型模式
没有人想犯错误,但是没有人能够不犯错误。犯了错误一般只能改过,却很难改正(恢 复)。世界上没有后悔药,但是我们在进行软件系统的设计时候是要给用户后悔的权利(实 际上可能也是用户要求的权利:)),我们对一些关键性的操作肯定需要提供诸如撤销(Undo)的操作。那这个后悔药就是 Memento 模式提供的。 Memento 模式的关键就是要在不破坏封装行的前提下,捕获并保存...原创 2019-08-15 15:25:49 · 140 阅读 · 0 评论 -
设计模式18--Mediator模式(中介者模式)---行为型模式
在面向对象系统的设计和开发过程中,对象之间的交互和通信是最为常见的情况,因为 对象间的交互本身就是一种通信。在系统比较小的时候,可能对象间的通信不是很多、对象 也比较少,我们可以直接硬编码到各个对象的方法中。但是当系统规模变大,对象的量变引 起系统复杂度的急剧增加,对象间的通信也变得越来越复杂,这时候我们就要提供一个专门 处理对象间交互和通信的类,这个中介者就是 Mediator 模...原创 2019-08-15 15:35:10 · 134 阅读 · 0 评论 -
设计模式19--Command模式(命令模式)---行为型模式
Command 模式通过将请求封装到一个对象(Command)中,并将请求的接受者存放到 具体的 ConcreteCommand 类中(Receiver)中,从而实现调用操作的对象和操作的具体实现 者之间的解耦。 Command 模式结构图中,将请求的接收者(处理者)放到 Command 的具体子类 ConcreteCommand 中,当...原创 2019-08-15 16:19:29 · 166 阅读 · 0 评论 -
设计模式20--Visitor模式(访问者模式)---行为型模式
在面向对象系统的开发和设计过程,经常会遇到一种情况就是需求变更(Requirement Changing),经常我们做好的一个设计、实现了一个系统原型,咱们的客户又会有了新的需 求。我们又因此不得不去修改已有的设计,最常见就是解决方案就是给已经设计、实现好的 类添加新的方法去实现客户新的需求,这样就陷入了设计变更的梦魇:不停地打补丁,其带 来的后果就是设计根本就不可能封闭、编译永远...原创 2019-08-15 16:28:40 · 196 阅读 · 0 评论 -
设计模式21--Chain of Responsibility模式(职责链模式)---行为型模式
熟悉 VC/MFC 的都知道,VC 是“基于消息,事件驱动”,消息在 VC 开发中起着举足 轻重的作用。在 MFC 中,消息是通过一个向上递交的方式进行处理,例如一个 WM_COMMAND 消息的处理流程可能为: 1) MDI 主窗口(CMDIFrameWnd)收到命令消息 WM_COMMAND,其 ID 位 ID_ ×××; 2) MDI 主窗口将消息传给当前活动的 MDI ...原创 2019-08-15 16:35:54 · 136 阅读 · 0 评论 -
设计模式22--Iterator模式(迭代器模式)---行为型模式
Iterator 模式应该是最为熟悉的模式了,最简单的证明就是我在实现 Composite 模式、 Flyweight 模式、Observer 模式中就直接用到了 STL 提供的 Iterator 来遍历 Vector 或者 List 数据结构。 Iterator 模式也正是用来解决对一个聚合对象的遍历问题,将对聚合的遍历封装到一个 类中进行,这样就避免了暴露这个聚合...原创 2019-08-15 16:44:04 · 145 阅读 · 0 评论 -
设计模式5--Prototype模式(原型模式)---创建型模式
Prototype 模式也正是提供了自我复制的功能,就是说新对象的创建可以通过已有对象进行创建。在 C++中拷贝构造函数(Copy Constructor)曾经是很对程序员的噩梦,浅层拷贝和深层拷贝的魔魇也是很多程序员在面试时候的快餐和系统崩溃时候的根源之一。 Prototype 模式提供了一个通过已存在对象进行新对象创建的接口(Clone),Clone(...原创 2019-07-22 16:32:49 · 120 阅读 · 0 评论 -
设计模式4--Builder模式(建造者模式)---创建型模式
生活中有着很多的Builder的例子,个人觉得大学生活就是一个Builder模式的最好体验:要完成大学教育,一般将大学教育过程分成 4 个学期进行,因此没有学习可以看作是构建完整大学教育的一个部分构建过程,每个人经过这 4 年的(4 个阶段)构建过程得到的最后的结果不一样,因为可能在四个阶段的构建中引入了很多的参数(每个人的机会和际遇不完全相同)。 Builder 模式...原创 2019-07-22 16:19:48 · 193 阅读 · 0 评论 -
设计模式7--Adapter模式(适配器模式)---结构型模式
Adapter 模式解决的问题在生活中经常会遇到:比如我们有一个 Team 为外界提供 S 类服务,但是我们 Team 里面没有能够完成此项人物的 member,然后我们得知有 A 可以完成这项服务(他把这项人物重新取了个名字叫 S’,并且他不对外公布他的具体实现)。为了保证我们对外的服务类别的一致性(提供 S 服务),我们有以下两种方式解决这个问题: 1)把 B...原创 2019-07-24 15:05:03 · 112 阅读 · 0 评论 -
设计模式8--Decorator模式(装饰模式)---结构型模式
在 OO 设计和开发过程,可能会经常遇到以下的情况:我们需要为一个已经定义好的类添加新的职责(操作),通常的情况我们会给定义一个新类继承自定义好的类,这样会带来一个问题(将在本模式的讨论中给出)。通过继承的方式解决这样的情况还带来了系统的复杂性,因为继承的深度会变得很深。 而 Decorator 提供了一种给类增加职责的方法,不是通过继承实现的,而是通过组合。有关这...原创 2019-07-24 16:03:46 · 121 阅读 · 0 评论 -
设计模式9--Composite模式(组合模式)---结构型模式
在开发中,我们经常可能要递归构建树状的组合结构,Composite 模式则提供了很好的解决方案。 //Component.h #pragma once #include <memory> class Component { public: Component(); virtual ~Component(); public: virtual void Operation()...原创 2019-07-24 16:51:00 · 137 阅读 · 0 评论 -
设计模式10--Flyweight模式(享元模式)---结构型模式
在面向对象系统的设计何实现中,创建对象是最为常见的操作。这里面就有一个问题:如果一个应用程序使用了太多的对象,就会造成很大的存储开销。特别是对于大量轻量级(细粒度)的对象,比如在文档编辑器的设计过程中,我们如果为没有字母创建一个对象的话,系统可能会因为大量的对象而造成存储开销的浪费。例如一个字母“a”在文档中出现了100000 次,而实际上我们可以让这一万个字母“a”共享一个对象,当...原创 2019-07-24 17:08:59 · 187 阅读 · 0 评论 -
设计模式11--Facade模式(外观模式)---结构型模式
举一个生活中的小例子,大凡开过学或者毕过业的都会体会到这样一种郁闷:你要去 n个地方办理 n 个手续(现在大学合并后就更加麻烦,因为可能那 n 个地方都隔的比较远)。但是实际上我们需要的就是一个最后一道手续的证明而已,对于前面的手续是怎么办的、到什么地方去办理我们都不感兴趣 实际上在软件系统开发中也经常回会遇到这样的情况,可能你实现了一些接口(模块),而这些接口(模...原创 2019-07-24 17:24:36 · 159 阅读 · 0 评论 -
设计模式12--Proxy模式(代理模式)---结构型模式
至少在以下集中情况下可以用 Proxy 模式解决问题: 1)创建开销大的对象时候,比如显示一幅大的图片,我们将这个创建的过程交给代理去完成,GoF 称之为虚代理(Virtual Proxy); 2)为网络上的对象创建一个局部的本地代理,比如要操作一个网络上的一个对象(网络性能不好的时候,问题尤其突出),我们将这个操纵的过程交给一个代理去完成,GoF 称之为远程代理(Remote...原创 2019-07-24 17:34:29 · 147 阅读 · 0 评论 -
设计模式1--Factory模式(工厂方法模式)---创建型模式
在面向对象系统设计中经常可以遇到以下的两类问题: 1)为了提高内聚(Cohesion)和松耦合(Coupling),我们经常会抽象出一些类的公共接口以形成抽象基类或者接口。这样我们可以通过声明一个指向基类的指针来指向实际的子类实现,达到了多态的目的。这里很容易出现的一个问题 n 多的子类继承自抽象基类,我们不得不在每次要用到子类的地方就编写诸如 new ×××;的代码。这里带来两个...原创 2019-07-22 14:48:24 · 146 阅读 · 0 评论 -
设计模式2--AbstactFactory模式(抽象工厂模式)---创建型模式
假设我们要开发一款游戏,当然为了吸引更多的人玩,游戏难度不能太大(让大家都没有信心了,估计游戏也就没有前途了),但是也不能太简单(没有挑战性也不符合玩家的心理)。于是我们就可以采用这样一种处理策略:为游戏设立等级,初级、中级、高级甚至有BT 级。假设也是过关的游戏,每个关卡都有一些怪物(monster)守着,玩家要把这些怪物干掉才可以过关。作为开发者,我们就不得不创建怪物的类,然...原创 2019-07-22 15:41:15 · 162 阅读 · 0 评论 -
设计模式3--Singleton模式(单例模式)---创建型模式
Singleton 模式解决问题十分常见,我们怎样去创建一个唯一的变量(对象)?在基于对象的设计中我们可以通过创建一个全局变量(对象)来实现,在面向对象和面向过程结合的设计范式(如 C++中)中,我们也还是可以通过一个全局变量实现这一点。但是当我们遇到了纯粹的面向对象范式中,这一点可能就只能是通过 Singleton 模式来实现了,可能这也正是很多公司在招聘 Java 开发人员时候...原创 2019-07-22 15:49:31 · 162 阅读 · 0 评论 -
设计模式6--Bridge模式(桥接模式)---结构型模式
总结面向对象实际上就两句话:一是松耦合(Coupling),二是高内聚(Cohesion)。面向对象系统追求的目标就是尽可能地提高系统模块内部的内聚(Cohesion)、尽可能降低模块间的耦合(Coupling)。然而这也是面向对象设计过程中最为难把握的部分,大家肯定在OO 系统的开发过程中遇到这样的问题: 1)客户给了你一个需求,于是使用一个类来实现(A); 2)客户需求变化,...原创 2019-07-23 16:00:15 · 184 阅读 · 0 评论