设计模式
chmy1992
这个作者很懒,什么都没留下…
展开
-
备忘录模式
备忘录(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态。Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻它的内部状态,并可以使用备忘录恢复内部状态。Originator可以根据需要决定Memento存储Originator的哪些内部原创 2017-08-29 17:50:39 · 186 阅读 · 0 评论 -
装饰模式
首先来看一个场景,你今天和一个爱登山的MM约会了,你需穿一套登山装,明天你和一个爱运动的妹妹约会,你需要穿一套运动服,后天你和一个比较喜欢绅士的妹纸约会,你就需要西装革履,但是无论你穿什么,你还是你,唯一的你只是传了不同的衣服而已,仅仅是在装饰自己。装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。Component是定原创 2017-09-03 11:24:08 · 249 阅读 · 0 评论 -
中介者模式
中介者嘛,大家都应该知道是什么意思。比如联合国,其实就是一个中介机构,为多个国家提供一个交流平台,比如美帝说“伊拉克你要在搞核武器,我就揍你”,但是和伊拉克言语不通,需要联合国来传达,同样伊拉克发布的信息需要联合国传达给美国。这种模式就是中介者模式。中介者模式(Mediator),用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,因而使其耦合松散,而且可以独立地改变它们原创 2017-09-02 21:17:51 · 240 阅读 · 0 评论 -
职责链模式
大家可能去政府办过事,遇到一个效率不高的政府时,你可能就要头大了,A部门说你去B部门,B部门说你去C部门,C部门说你去B部门,然后你就头大了,不知道去哪里办理。再看另外一种情况,当地开发商可能要买一万亩的地,先去县里审批,县里一看太大了,审批权限不够,告诉你去市里审批,市里一看权限不够,告诉你去省里审批,省里一看权限不够,没办法啦,就去国土资源部审批吧,就像一个链条,当它发现自己的权限或能力不够的原创 2017-09-02 17:07:24 · 239 阅读 · 0 评论 -
原型模式
校招季又到了,大家都会去纷纷去投简历,投简历的时候你有没有一份一份的写呢,估计你是不会这么干的,你会拿一份模板填上自己的信息,发给A公司,然后B公司来了,你咋办呢,再把那个模板填一遍?你是不是傻,其实发给A公司和B公司的简历都差不多,那就好办了,把A简历copy一份,然后改改不就好了,但是这两份简历的原型都是一样的。原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原创 2017-09-02 15:01:40 · 215 阅读 · 0 评论 -
享元模式
首先来看一个情景,我们在写文档的时候,有很多的字,但是这些字难道真的一个一个独立的对像吗?如果真的是一个一个独立真实的对象,那么内存就会爆掉的。大家可能听说过字库,我们看到的字都是字库里面的,每个显示的字都是字库里面的,每个字在字库里只会有一个对象,那么就意味着文档里的相同的字都会指向同一个对象,这样的好处是什么呢?可以节省大量的资源。享元模式(Flyweight),运用共享技术有效地支持大量原创 2017-09-02 11:10:37 · 224 阅读 · 0 评论 -
适配器模式
大家知道,输电线用的是高压电,家庭照明使用的220V低压电,那怎么办呢,大家都知道了,使用变压器,其实也可叫适配器。适配器模式,将一个类的接口转换成客户希望的另外一个接口。Adapter 模式使得原本由于不兼容而不能一起工作的那些类可以一起工作。适配器模式主要解决的问题:东西在你面前,却不同使用,短时间又无法改造他,于是就需要想办法适配它。在软件开发中,也就是系统的数据和行为都正确,但接口原创 2017-09-01 20:10:22 · 305 阅读 · 0 评论 -
外观模式
炒过股票的可能知道中美股市的不同,中国股市散户为主,美国股市以大型基金机构为主。个人炒股由于专业知识不够,而且还要不断的关注每个股票,不过最终亏本的还是很多的,但是在美国,散户可以把钱给基金,大型基金有专业的知识,管理的股票比较多,最终多数能做到盈利,散户也可以获得相应的收益。从这个例子可以看到,由于散户和股票联系太多,不利于操作,耦合度过高,但是如果把钱给基金,就只有两个动作,给钱给基金,收回收原创 2017-09-01 21:13:50 · 195 阅读 · 0 评论 -
模板
其实这个模式,在C++的学习里已经接触过了,比如两个STL里面的栈,里面对栈的一些操作,无论栈里面存放的是整数,还是字符,其实操作都是一样的,因此可以使用一个模板来实现,避免了重复的代码。我们开始写冒泡机排序的模板,首先无论是给整数,还是浮点数,还是字符,冒泡排序的机制都是一样的,把这个数和它后面的数进行比较,不满足条件就交换,而子类只需要完成交换和比较的实现就可以了。#i原创 2017-09-01 16:42:28 · 217 阅读 · 0 评论 -
命令模式
想象一个场景,你是一个烧烤店的老板,卖烤鸡翅考羊肉,来了一群客人来点菜,模式一,直接给烧烤师傅发命令让他考鸡翅和烤羊肉,这样做简单粗暴,但是问题来了一旦人一多,师傅就很容易出错。实际上,一个店里都有一个服务员,客人都是直接问服务员,然后服务员给师傅发命令,这样做,提高了效率,师傅只负责烧烤,不负责其他的。很容易发现,第二种发出命令(服务员)和执行命令(执行命令)的责任分开。 命令模原创 2017-09-01 14:50:00 · 233 阅读 · 0 评论 -
建造者模式
相信大家都吃过中餐和KFC,这两种东西有什么区别呢?你吃一万个师傅炒出来的酸辣土豆丝可能有一万种味道,但是你吃一万家KFC大概会有一种味道。为什么呢,因为一万个师傅某个师傅可能忘记放盐了,另一个忘记放醋了,但是KFC是一套标准化流程,所以出来就是一个味道。那么怎么才能将中餐变成一个味道呢?那就是标准化流程,否者不让出厂。在软件设计中有什么应用场景呢?比如你在电脑上玩极品飞车游戏,每一关地图都会原创 2017-09-01 10:10:12 · 180 阅读 · 0 评论 -
代理模式
媒婆这个职业大多人可能都知道,媒婆是干什么的呢?当你找MM时,你需要向多个MM发送同样的问题,你多高,你喜欢什么,但是你可能很忙没有时间怎么办呢?那就找个媒婆替你自己去问。#include#includeusing namespace std;class Girl//追求的对象{private: string name;public: Girl(string _name原创 2017-08-30 14:51:11 · 225 阅读 · 0 评论 -
工厂模式
接着上文简单工厂模式的问题,简单工厂模式的最大优点是工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。比如你想产生加操作,直接把加号给工厂,工厂就产生了加类的产品。但是如果要添加新功能,比如求M数的N次方,就需要增加case分支,因此就违背了开放-封闭原则。什么叫开放封闭原则呢?开放:也就是该模块的行为是能够被扩展的,当应用程序的需求原创 2017-08-30 11:21:35 · 189 阅读 · 0 评论 -
简单工厂模式
问题:现在实现一个计算器功能,输入两个数和操作符,求两个数操作之后的结果。于是可以有这样一份代码:switch (ch) { case '+': ... }改进:使用面向对象的思想,让操作和实现分离,从而使得程序更加灵活,容易修改,并且易于复用。设计出这样的一个类:class operation{public: int getresult(int a, int原创 2017-08-30 10:47:12 · 233 阅读 · 0 评论 -
抽象工厂模式
问题来源:假设有这样一款游戏,游戏有等级,分别为初级,中级,高级甚至有BT级。假设也是过关的游戏,每个关卡都有一些怪物(monster)守着,玩家要把这些怪物干掉才可以过关。作为开发者,我们就不得不创建怪物的类,然后初级怪物、中级怪物等都继承自怪物类(当然不同种类的则需要另创建类,但是模式相同)。在每个关卡,我们都要创建怪物的实例,例如初级就创建初级怪物(有很多种类)、中级创建中级怪物等。可以想象原创 2017-08-29 21:27:33 · 278 阅读 · 0 评论 -
策略模式
策略模式:它定义了算法家族,分别封装起来,让它们之间可以互相替换,但是不会影响到使用算法的客户。策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合,策略模式依赖于多态。设计步骤:1. 策略的抽象类(纯虚基类),起到接口的作用,抽象类的指针可以访问所有子对象。2. 实现原创 2017-08-29 20:03:50 · 210 阅读 · 0 评论 -
组合模式
我们先看一个典型的UNIX文件系统,大家都知道UNIX文件系统采用的是多级索引结构,本图只给出了两级构架,其中直接物理块里存放的是文件的直接地址,而次级索引表指向一个和顶级索引表类的东西,这样就成了一个树形的构架,组合成了一个文件系统。组合模式,将对象组合成树形结构以表示‘部分-整体’的层次构架。组合模式使得用户对单个对象和组合对象的使用具有一致性。Component为原创 2017-09-03 15:56:12 · 221 阅读 · 0 评论