设计模式入门
文章平均质量分 73
初步探索设计模式
黑夜童话
#深度探索,力求本质#
#一切的价值,仅在于它满足了需求。#
展开
-
为什么要学设计模式?非学不可吗?
所有言语从一个故事开始,而故事从一份人物简历开始。人物姓名:王小二出生年月:不详年纪:十七八亦或者二十来岁性格:热血、冲动、抱负远大梦想:渴望成为一枚武林高手,最好习得一身绝世神功,从此可以独步江湖,笑傲红尘,金钱满库,美女满怀现实:只是个会使点蛮力,在街头打架斗殴的屌丝。“我爱上了一个不该爱的人,我的心中都是悔恨。只要想想原创 2016-08-14 17:39:58 · 2660 阅读 · 0 评论 -
设计模式C++版:第十五式职责链模式
职责链模式:使多个对象都有机会处理请求,从而便面请求发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着链条传递该请求,直到有一个对象处理它为止。类似状态模式。接收者和发送者都没有对方的明确信息,且链中的对象,自己也不知道链的结构。职责链可以简化对象的相互连接,仅保持一个后继者的引用,而不需保持须有接收者的引用。大大降低了耦合度。 需要注意的是,他和状态模式一样,有可能到了链的末端,请原创 2017-08-23 18:07:52 · 194 阅读 · 0 评论 -
设计模式C++版:第十九式解释器模式
解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该解释语言中的句子。比如配置文件,比如正则表达式,比如浏览器对HTML。当有一个语言需要解释执行,并且可将该语言中的句子表示为一个抽象语法树时,可以使用解释器模式。#pragma once #include#includeusing std::string;//文本类class Context原创 2017-08-27 21:21:46 · 248 阅读 · 0 评论 -
设计模式C++版:第十六式享元模式
享元模式:运用共享技术,有效支持大量细粒度的对象。在享元对象内部且不会随环境改变而改变的部分,成为享元对象的内部状态。而随环境改变而改变的,不可以共享的状态称为外部状态。内部状态,存储在享元对象中;外部状态可以考虑由客户端对象存储和计算,在调用享元对象的时候,传递给享元对象。#pragma once#include #include using std::string;原创 2017-08-24 13:22:11 · 183 阅读 · 0 评论 -
设计模式C++版:第二十式状态模式
直接上代码好了:#pragma once#include //前置声明class Work;class State{public: virtual void writeprogram(Work *w){} virtual ~State(){ }};//工作类class Work{public: Work(State* state) :m_hour(0)原创 2017-08-30 21:28:02 · 187 阅读 · 0 评论 -
设计模式C++版:第二十一式观察者模式
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。示例代码如下:#pragma once#include #include #include using std::string;using std::list;class Subject;//观察者接口class Ob原创 2017-08-30 21:45:21 · 210 阅读 · 0 评论 -
设计模式C++版:第零式简单工厂
在前面介绍C++基础的时候,我们写了一个简单地计算类 http://blog.csdn.net/thedarkfairytale/article/details/51750971 。下面使用设计模式的简单工厂类实现一下:使用简单工厂模式后的代码,和之前简单的封装以后对比发现,之前的单一接口,都变成了一个运算类,这样的好处是,我们隔离了各种运算,如果我们修改加法,则不必和原创 2016-08-15 19:36:27 · 386 阅读 · 0 评论 -
设计模式C++版:第五式装饰者模式
装饰模式,就是动态地为已有功能添加更多功能的一种方式把每个要装饰的功能放在单独的类中,让他包装它所有装饰的对象。所以需要执行特殊行为时,客户代码就可以在运行时根据需要有选择、按顺序的使用装饰功能包装对象。这也是和建造者模式不同的地方。装饰者模式的优势是:可以简化核心类,把核心职责和装饰功能区分开。下面是简单示例:#include #include class Person{pu原创 2016-08-21 18:50:51 · 294 阅读 · 0 评论 -
设计模式C++版:第二十二式访问者模式
访问者模式:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变个元素的类前提下定义作用于这些元素的新操作。优点:就是把数据结构和操作分离。缺点:增加新的数据结构变得困难。代码示例如下:#pragma once#include #include using std::list;class Man;class Woman;//状态即操作class Act原创 2017-08-30 22:09:10 · 189 阅读 · 0 评论 -
设计模式 C++版:第二十三式 模板方法
定义一个操作中的算法骨架,而将一些步骤延迟到子类中。用一句听得懂的话说,就是把一个算法中不变的部分搬移到超类——父类中,把变的部分留给子类,通过接口重写的方式完成各自变化的部分。好处是,减少了代码的耦合,提高了复用。简单代码如下:#include using namespace std;class Father_Class{public: void template_meth原创 2017-10-13 22:51:08 · 260 阅读 · 0 评论 -
设计模式C++版:第七式代理模式
开始代理模式以前我们先说一下什么是代理。这个词想必生活中听过见过的太多,比如经销商的烟酒代理,洗漱用品代理等,其实经销代理也就是我们常说的批发商,他们从厂家那里拿货,而后卖给实际用户。经销商的代理好处是什么,为什么厂家不直接卖给用户赚钱呢?比如说我们常用的笤帚什么的,一家厂家的用户全体是全国乃至全世界所有的用户,它不可能和数以百万乃至千万计中的每一个客户打交道。于是每个地区有一个批发商,批原创 2016-09-03 09:34:13 · 423 阅读 · 0 评论 -
设计模式C++版:第十四式命令模式
命令模式:将一个请求封装为一个对象,从而使你可用不同请求。对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。优点就是把一个请求操作的对象,和一个知道怎么一个操作的对象分隔开,不再是紧耦合。敏捷开发原则,不要为代码添加基于猜测的,实际不需要的功能。这也是编程中很重要的一个原则——KISS原则。#pragma once#include #include using std:原创 2017-08-23 17:34:54 · 238 阅读 · 0 评论 -
设计模式C++版:第十三式中介者模式
A:“我想租房,价位1500左右。”中介:“好的,我这边有房源。什么时候过来看看,价钱划算。”B:“我这边有闲置房间,想租出去,2000以上。”中介:“可以的,我这边有客户。价钱好商量。”中介---A:“房东B说了,低于2000不可以。”中介---B:“客户A说了,高于18000,就太高了,不想考虑。”......尽管讲一个系统分割成所需对象,通常可以增加其复用性。原创 2017-08-22 15:43:49 · 195 阅读 · 0 评论 -
设计模式C++版:第十八式备忘录模式
备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在外部保存为以后恢复之前状态,存储信息。缺点如果数据较多,需要储存的节点也多的话,将会消耗大量内存。不过这也不是什么特别大的问题,如今个人计算机配置很少有低于8G或者16G内存的,而消耗大于8G或16G以上内存的程序相对来说还是比较少的。服务器就更可以随意配置了。#include #includeusing std::v原创 2017-08-25 08:39:29 · 217 阅读 · 0 评论 -
设计模式C++版:第十式外观模式
在开发阶段子系统会因为不断地重构变得越来越复杂,模式使用时会产生大量的小类,使用外观模式可以减少它们之间的依赖。外观模式,重点在于分层,层与层之间建立外观。这样两个不同的复杂层之间,使用简单的接口。其次、维护一个遗留系统时,提供一个外观,让新系统与外观交互,会使得接口简单清晰。#include class SubA{public: void methodA() { printf原创 2017-01-06 21:16:57 · 187 阅读 · 0 评论 -
设计模式C++版:第十一式单例模式
单例模式,保证一个类仅有一个实例,并提供一个访问它的全局节点。需要注意,如果是多线程,可能会出现同时访问Singleton的情况,造成创建多个实例,为了防止出现这种情况,我们需要加锁。下面我们就简单模拟一个多线程情况下的单例模式,代码如下:#include #include #include class Singleton{public: static Singleton*原创 2017-01-08 10:53:06 · 245 阅读 · 0 评论 -
设计模式C++版:第十二式桥接模式
#include using std::cout; using std::endl;/*合成、聚合复用原则:尽量使用合成聚合,尽量不要使用继承。*/class PhoneSoft{public: virtual void run(){ } virtual ~PhoneSoft(){ }};class GameSoft :public PhoneSoft{public原创 2017-01-08 18:53:51 · 210 阅读 · 0 评论 -
设计模式C++版:第一式策略模式
定义了算法家族,分别封装提来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。具体示例如下:class CashSuper //抽象{public:virtual double acceptCash(double money) = 0;virtual ~CashSuper(){}};class Ca原创 2016-08-15 22:06:11 · 284 阅读 · 0 评论 -
设计模式C++版:第二式抽象工厂
前面我们介绍过了简单工厂,如果我们还想提供更高一层的抽象,或者在业务需要时,我们需要为每一个简单的工厂提供一个抽象,那我们可以使用抽象工厂。而抽象工厂,也仅仅是对简单工厂的进一步抽象。这也在一定程度上说明了,面向对象编程的能力,其实就是抽象事物的能力。下面举个简单的示例进行说明:抽象工厂,优点在于使用一个具体的工厂十分容易。只需要改变具体的工厂,就可以使用不原创 2016-08-16 19:16:31 · 390 阅读 · 0 评论 -
设计模式C++版:第三式适配器模式
在生活中,我们对于适配器并不陌生,比如智能的稳压器,还有充电宝对安卓和苹果手机的转换接口,都是适配器的一种。适配器模式,是为了,将一个类的接口转换成希望的接口,优点是使得原本不兼容的接口,可以一起工作。具体示例如下(别想着赋值粘贴了,还是图片方式,自己动手敲一下,感觉绝对不同):原创 2016-08-16 19:31:56 · 318 阅读 · 0 评论 -
设计模式C++版:第四式建造者模式
开始建造者模式之前,我们先提出使用建造者模式的使用场景——有一个复杂对象的需要构建,而且构建的过程是稳定的,这个时候我们可以考虑建造者模式。比如创建四边形,我们可以设定一个画图方式——顺时针画图。也就是说先画上面的一条边,再画右边的边,接着画下面的边,最后画左边的边。这个构造过程是稳定的。其实无论是顺时针还是逆时针或者是交叉画,一旦确定下来规则,整个构造过程就是稳定的了。当然你不能画三条边或者六条原创 2016-08-18 22:23:29 · 289 阅读 · 0 评论 -
设计模式C++版:第六式迭代器模式
迭代器模式?很奇怪的名字。我们在使用STL的时候,都用过迭代器,这么平常的一种东西也是一种模式?答案是肯定的。世界上很多看起来习以为常的东西其实一点也不平常,甚至很难深入的理解。我们经常使用迭代器,可是如果你问一下迭代器到底是什么,肯定有很多人不知道。在开始代码之前,我们先给出一个迭代器模式的定义好了:提供一种方法顺序访问一个聚合对象的各个元素,又不暴露该对象的内部表示。再简单一点,迭代器原创 2016-08-24 17:51:22 · 423 阅读 · 0 评论 -
设计模式C++版:第八式工厂方法模式
说实话,这是一个让我感到抗拒的模式,在实际中我从来没用过它。原因有两个,一它只是简单工厂的进一步推广在逻辑清晰度上,并不必简单工厂或者抽象工厂优异,二、一旦发生扩展行的改动立马会有大量的代码开发量,让人不自觉的产生抗拒。当然作为一种模式的介绍,我们还是要介绍它的。下面是关于她的简单定义和代码示例:创建一个用于创建对象的接口,让子类决定实例化哪一个子类,并把这种实例化延迟到它的子类。#i原创 2016-09-03 10:37:11 · 296 阅读 · 0 评论 -
设计模式C++版:第十七式原型模式
原型其实就是从一个对象再创建另一个对象,且不需要知道细节。如果使用原型模式,要保持灵活性,接口应该尽量丰富例如:起始每个接口只影响一个属性,然后提供多个单一属性接口组合成的多属性接口。#include #include using std::string;using std::cout; using std::endl;/*因为所有的子类,即原型要使用到父类类型,Proto原创 2017-08-24 20:35:57 · 183 阅读 · 0 评论 -
设计模式C++版:第九式组合模式
组合模式:将对象组合成树形结构以表示部分和整体的关系。组合模式使得用户对单个对象和组合对象的使用具有一致性。优点:基本对象可以组合成更复杂的对象。任何用到基本对象的地方,都可以使用组合对象。示例代码:#include using std::string;#include using std::list;class CTest{public: CTest(string name)原创 2017-01-05 21:55:40 · 195 阅读 · 0 评论