设计模式
枯萎的海风
向来缘浅, 奈何情深, 彼此豆蔻,谁许谁地老天荒, 敌不过似水流年, 逃不过此间少年
展开
-
在C++中实现委托(Delegate)
原文地址个人理解:说明: 最近在阅读设计模式相关的内容, 正好看到观察者模式的部分, 发现.net 有一个委托机制, 本质上就是函数指针对象。这篇大作中, 介绍了C++ 没有提供委托机制, 不过委托机制的本质就是调用成员函数的函数指针,实现回调。 不过由于C++ 类型检查比较严格, 所以虽然文中也介绍了在汇编级的实现中只要两行代码就好了, 不过 还是转载 2016-03-18 21:04:26 · 5817 阅读 · 2 评论 -
利用外观模式模拟股民炒股 C++
说下对外观模式的理解 外观模式, 为子系统中的一组接口提供了一个一致的界面, 此模式定义了一个高级接口, 这个接口使得这个子系统更加容易使用。 利用外观模式, 客户可以完全不用知道子系统的内部实现, 只要调用外观模式对外提供的接口即可。他完美的体现了依赖倒转原则和迪米特法则的思想。 通常可以用来做分层结构, 在层与层之间利用外观模式, 减低层之间的耦合度。减小因不断重构演化使程序越来越复杂。原创 2016-03-17 19:41:48 · 636 阅读 · 0 评论 -
使用模板方法模式实现选择题答题 C++
说下对模板模式的理解: 模板模式, 定义一个操作中的算法的骨架, 而将一部分的步骤延时到子类中去。 通过模板方法, 使得子类可以在不改变一个算法结构的情况下, 可以重新定义算法的某些特定步骤。 他将不变的行为搬移到超类中去, 去除了类中的重复代码, 体现出他代码复用的优势。 ie, 当不变的和可变的行为在方法的子类实现中混合在一起的时候, 不变的行为会重复在子类中出现, 这时候, 我们可以考虑原创 2016-03-17 16:29:03 · 1155 阅读 · 1 评论 -
利用原型模式实现简历复印 C++
说下对原型模式的理解: 原型模式是指用原型实例指定创建对象的种类, 并且通过拷贝这些原型创建新的对象。 本质就是从一个对象创建另一个可定制的对象, 并且还不需要知道任何创建的细节信息。 这个感觉, 好像没什么新的东西, 和C++自带的拷贝构造和拷贝赋值函数非常类似, 只不过自带的两个函数都是浅拷贝, 而这个原型模式一般要求是深拷贝。因为比较简单, 也就没有画UML图了运行效果图: 直接上代码原创 2016-03-17 11:40:13 · 686 阅读 · 0 评论 -
工厂方法模式实现四则运算 C++
说下对工厂方法模式的理解: 工厂方法模式定义了一个用来创建对象的接口, 他让子类决定实例化哪个对象, 他使得一个类的实例化延迟到其子类。 简单工厂模式最大的优点是在于工厂类中包含了必要的逻辑判断,根据客户端的选择动态的实例化相关的类, 对客户端来说去除了与具体产品的依赖。 但是他一定程度上违背了开闭原则, 对扩展开放的同时, 对修改也开放了。 采用工厂方法模式, 可以根据依赖倒转原则, 将工厂原创 2016-03-17 10:24:41 · 871 阅读 · 0 评论 -
代理模式实现为别人做嫁衣 C++
说下对代理模式的理解,代理模式就是用代理对象来替代实际对象,完成实际对象应该完成的操作,如给妹子送花, 或者打怪升级。 本质上, 他就是在访问对象的时候, 加入了一定程度的间接性, 通过这种间接性可以实现各种用途。 UML: 运行效果图 代码: target.h#ifndef _TARGET_H_#define _TARGET_H_#include <string>class CTa原创 2016-03-17 08:46:30 · 411 阅读 · 0 评论 -
装饰模式实现穿衣搭配 C++
装饰者模式,是可以用来动态的给一个对象添加一些额外的职责, 就增加功能而言, 装饰者模式比生成子类更加灵活。 他是一种为已有功能动态添加更多功能的方式, 新添加的代码, 主要用来装饰原有类的核心职责或者主要行为方式。为某些需要在特定情况下才会使用的特殊行为提供一种解决方案。 另外, 通过把类中的装饰功能从类中搬移出去, 可以简化原有的类, 将类的核心职责和装饰功能区分开来, 可以除去相关类中的重原创 2016-03-16 16:27:12 · 873 阅读 · 0 评论 -
策略模式加工厂模式实现商场促销 C++
简单记录一下策略模式,策略模式是一种定义一系列算法的方法,这些算法完成相同工作, 只是实现的细节不一样。那么我们可以利用策略模式, 封装算法, 实现算法与算法使用者之间的解耦工作。 另外, 策略模式利于单元检测, 因为各个算法之间是相互独立的。下面上UML图 这个图和简单工厂模式的图很类似, 不过简单工厂模式中 工厂类 和 产品基类之间是一种依赖关系, 而这里是一种聚合关系。代码如下: C原创 2016-03-16 11:00:40 · 1365 阅读 · 0 评论 -
使用简单工厂模式实现四则运算 C++
今天实现了一个简单工厂模式, 实现四则运算。 说下对简单工厂的理解, 个人感觉他就是利用一个工厂类的静态函数获取一个工厂产品的实例, 在C++中表现就是 获取一个指向产品的派生类的基类指针, 利用多态 实现具体产品类的调用。 ie, 利用工厂类负责创建对象的实例 下面这是我们所绘制的C++的UML类图 代码实现: operation.h#ifndef _OPERATION_H_#defi原创 2016-03-16 08:38:15 · 3208 阅读 · 0 评论 -
利用桥接模式实现手机品牌和手机软件之间的解耦 C++
1. 合成/聚合复用原则在面向对象编程过程中, 继承是一个非常强大的工具, 它体现出子类和父类之间的强耦合关系。对象的继承关系在编译的时候, 就已经决定好了, 无法在运行时候做改变。以至于父类的更改会影响到子类。聚合: 表示一种较弱的 拥有关系,A 对象可以包含 B 对象, 而B 对象不是 A 的一部分 合成: 表示一种较强的 拥有关系, 体现的是严格的部分和整体的关系, 并且部分和整体的声明周期原创 2016-03-27 15:06:57 · 811 阅读 · 0 评论 -
利用命令模式模拟烤肉店点餐 C++
1. 命令模式将一个请求封装为一个对象,从而可用不同的请求对对象参数进行参数化, 对请求队列或记录请求日志, 以及支持可撤销操作等。 命令模式的优点: 1. 可以容易的设计一个命令队列 2. 在需要的情况下, 可以比较容易的将命令记入日志 3. 允许接收请求的一方决定是否接受命令 4. 可以很容易的实现对请求的撤销和重做 5. 可以很容易的添加新的命令类敏捷开发中告诉我们, 不要伪代码添原创 2016-03-27 17:43:13 · 1151 阅读 · 0 评论 -
利用责任链模式模拟加薪请求 C++
1. 责任链模式他使得多个对象都有机会处理请求, 从而避免请求的发送者和接收者之间的耦合关系。他通过将这些对象连成一条链,并沿着这条链来传递请求, 直到有一个对象处理他为止。但是这个模式要求我们处于后方的对象需要能够处理更多的职责, 需要确保请求传递到了链表末端一定可以被处理。而在每个对象中, 需要确定是自行处理, 还是转移责任。 一般来说链表的越后方, 处理的职责也越大2. UML图3. 运行示原创 2016-03-27 20:01:31 · 504 阅读 · 0 评论 -
利用中介者模式模拟两个对象对话 C++
1. 中介者模式用一个中介对象来封装一系列的对象的交互, 中介者使得各个对象不需要显示调用, 从而降低他们之间的耦合, 并且可以独立的改变他们之间的交互。一般而言, 通过将一个系统划分为多个对象, 通常可以增加他的复用性, 但是对象之间相互连接的激增, 又会降低他的复用性。 我们可以这么理解, 由于大量的连接使得一个对象需要依赖其他对象才能工作, 系统表现成为一个不可分割的整体, 这时候, 再想对原创 2016-03-28 23:12:53 · 665 阅读 · 0 评论 -
建造者模式加模板模式实现建造小人 C++
说下对建造者模式的理解: 建造者模式:将一个复杂的对象的构建与他的表示分离, 使得同样的构建过程可以创建不同的表示。 它使用builder 构建各个部分的抽象接口, 由子类具体实现。 通过director 指挥构建的过程, 这个构建的过程一般是相对比较固定的。 他主要用来创建一些比较复杂的对象,并且这些对象之间的建造顺序通常是稳定的, 但对象内部的构建通常面临比较复杂的变化。 他使得建造代码原创 2016-03-18 11:13:53 · 1000 阅读 · 0 评论 -
观察者模式实现老板状态变化通知 C++
说下对观察者模式的理解: 观察者模式定义了一种一对多的依赖关系, 让多个观察者对象可以同时监听某一主题对象, 当这个主题对象的状态发生改变的时候, 就会通知所有的观察者对象, 使他们可以自动更新自己。 subject 类, 一般称为主题类或者通知者类, 一般可以使用一个抽象类或者一个接口来实现, 他提供接口可以增加或者删除观察者对象。 observer 类, 一般使用抽象类或者接口实现。 当原创 2016-03-18 15:50:26 · 1853 阅读 · 0 评论 -
利用委托加观察者模式实现老板状态变化通知C++
之前写过利用观察者模式实现老板状态变化通知的程序, 当时书本上介绍了当观察者对象所提供的接口不同时候, 也就是各个观察者类并不是派生自同一个观察者接口CIObserver的时候, 观察者模式就遇到一些问题, 在C#中, 我们可以借助委托机制很轻松的解决。然而C++并不提供现成的委托机制, 需要我们自己编写相应代码实现委托的功能, 主要是利用模板的参数推导功能。 UML图: 运行效果图:原创 2016-03-19 22:39:37 · 755 阅读 · 0 评论 -
C++模拟C#事件委托机制(一)
原文地址:点我跳转至原文写在前面的话:需要特别注意原文给出的代码是有问题的!!!原文的主体思路是正确的,他实际上是利用模板的参数推导特性, 将类成员函数从类中剥离开来, 实现委托机制下面给出我们调试成功的代码:需要说明的是, 为了调试程序, 我们顺手把所有内容全放到了main.cpp中, 这个风格是不太好的。。。。#include #includ转载 2016-03-18 21:14:52 · 557 阅读 · 0 评论 -
利用享元模式模拟网站对象建立 C++
1. 享元模式的概念享元模式, 运用共享技术可以有效的支持大量细粒度的对象。 利用享元工厂, 用来创建并且管理 享元对象。 我们把享元对象内部并且不会随着环境改变而改变的部分, 称为是享元的内部对象, 而把随着环境改变而改变的, 不可以被共享的状态, 称为是外部对象。 享元模式, 可以避免大量相似的类的开销。在程序设计过程中, 有时候需要生成大量细粒度的类实例来表示数据。 如果可以发现这些实例原创 2016-04-01 12:08:53 · 455 阅读 · 0 评论 -
利用解释器模式模拟音乐播放 C++
1. 解释器模式解释器模式, 就是给定一个语言, 定义他的文法的一种表示, 并定义一个解释器, 这个解释器使用该表示来解释语言中的句子。 如果一种特定类型的问题发生的频率足够高, 那么可能就值得将该问题的各个实例表述为一个简单语言中的一个句子。 这样就可以构建一个解释器, 该解释器通过解释这些句子来解决该问题。 正则表达式就是他的一种应用。 直观上就感觉是带了一个翻译一样。 他可以很容易的改原创 2016-04-01 17:28:03 · 586 阅读 · 0 评论 -
C++反射的实现
C++反射的实现参考了wxWidgets的相关代码,并进行简化,同时借鉴了网上的相关内容,改进之处在于,只需要继承基本类Object,在类的头文件中定义宏,DECLARE_CLASS(类名),在类的实现文件中定义宏,IMPLEMENT_CLASS(类名),即可,欢迎指正。 代码以来的库都是C++标准库,所以不需要额外添加库。 例如: #include#inclu转载 2016-03-24 19:16:44 · 602 阅读 · 0 评论 -
使用C++模拟实现 C# 中的反射功能
最近在看设计模式的相关内容, 看到抽象工厂模式这章节的时候, 书上介绍说, 抽象工厂模式在替换具体工厂类型的时候比较方便, 但是在涉及添加一个新的产品类的时候, 需要修改现有的工厂来支持这个新的产品, 违反了开闭原则。 一般可以采用简单工厂并借助反射的功能, 解决这个不足。 C# 中自带反射的功能, 但是我们C++居然没有, 这个一个比较讨厌的地方, 于是, 我们研究了相关内容, 参考了一些文章,原创 2016-03-24 19:47:41 · 1378 阅读 · 0 评论 -
使用组合模式实现公司结构管理 C++
组合模式: 就是将对象组合成树形结构以表示’部分–整体’ 关系的层次结构。 组合模式使得对象对单个对象和组合对象的使用具有一致性。 组合模式的基类,为对象声明接口, 在适当的情况下, 实现所有类的默认行为, 声明一个接口用于访问和管理子对象的部件。 透明模式和安全模式: 透明模式,是指子类中的所有对象都有着和基类相同的访问接口, 缺点是, 对一些叶节点而言有些接口是没有意义的。 安全模式,原创 2016-03-24 09:23:55 · 682 阅读 · 0 评论 -
单例模式的简单小结 C++
单例模式: 保证一个类只有一个实例, 并提供一个访问他的全局访问点 通常当我们需要确保一个类只有一个实例的时候, 应该选用单例模式, 让类自身负责保存他的唯一实例。这个类可以保证没有其他实例被创建, 同时提供一个访问这个唯一实例的一个方法。 一般我们可以使用 私有构造方法来实现这个功能, 让外界无法 new 出这个类的对象。代码如下:/*****************************原创 2016-03-24 11:38:17 · 563 阅读 · 0 评论 -
使用备忘录模式实现游戏进度备份 C++
备忘录模式: 在不破坏封装性的前提下, 捕获一个对象的内部状态, 并在该对象之外保存这个状态, 这样以后就可以将该对象恢复到原先保存的状态。 他将需要保存的数据状态封装在了 一个 专有的类中,当需要更改的时候, 也不会影响到客户端的代码。 他适用于功能复杂, 但需要维护或者记录属性历史的类, 或者需要保存的属性只是众多属性中的一小部分的时候, 可以根据保存的 状态信息还原之前的状态信息。原创 2016-03-24 08:11:09 · 634 阅读 · 0 评论 -
迭代器模式小结
今天看了下迭代器模式, 发现这个模式和C++的stl中的容器所提供的迭代器非常类似, 就不在额外敲代码了, 说下对他的小结吧。 迭代器模式: 提供一种方法可以顺序访问一个聚合对象中的各个元素, 而又不会暴露该对象的内部表示。 ie, 当需要访问一个聚集对象, 并且不用管这些对象都是什么时候需要遍历的时候, 就需要考虑使用迭代器模式。 迭代器模式 为遍历不同的聚集结构提供了各种统一的接口,如C原创 2016-03-24 09:48:27 · 487 阅读 · 0 评论 -
使用适配器模式模拟篮球队翻译 C++
说下对适配器模式的理解: 适配器模式: 将一个类的接口转换成客户希望的另外一个接口, 他使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 ie, 系统的数据和行为都是正确的, 但是接口不服符合时, 我们就应该考虑使用适配器, 目的是使得控制范围之外的一个原有对象与某个接口匹配。 适配器模式主要应用于希望复用一些现存的类, 但是接口又与复用环境不一致的情况。 一般在后期维护, 或者调用原创 2016-03-22 13:27:30 · 615 阅读 · 0 评论 -
使用状态模式实现加班状态变化C++
说下对状态模式的理解: 状态模式:当一个对象的内在状态改变时候, 允许改变其行为, 这个对象看起来像是改变了其类。 主要用来解决,当控制一个对象状态转化的条件表达式过于复杂的情况。我们可以把状态的判断逻辑转移到表示不同状态的一系列类中去, 可以实现把复杂的判断逻辑简化。 通俗的来讲, 就是可以利用状态模式将一个类中含有大量分支判断的方法做到责任分解。消除庞大的条件分支语句。需要特别说明的是,原创 2016-03-21 23:04:03 · 534 阅读 · 0 评论 -
使用抽象工厂模式实现数据库替换管理 C++
说下对抽象工厂模式的理解: 抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口, 而无需指定他们具体的类。 在抽象工厂的内部包含了所有产品创建的抽象方法, 也就是说, 每个工厂都会生产所有提供的产品,因而, 不同的产品有不同工厂所生产的不同规格。 他的优点是: 1. 可以方便的更换产品的系列, ie, 更换具体的工厂 2. 他让具体的创建实例过程和客户端分离, 客户通过他们的抽原创 2016-03-20 14:16:35 · 1224 阅读 · 0 评论 -
23种设计模式
点我进入原文23种设计模式目录创建型1. Factory Method(工厂方法)2. Abstract Factory(抽象工厂)3. Builder(建造者)4. Prototype(原型)5. Singleton(单例)结构型6. Adapter Class/Object(适配器)7. Bridge(桥接)8. Composit转载 2016-07-26 22:35:24 · 5259 阅读 · 3 评论