摘要: 意图:定义对象的一种一对多的依赖关系,当一个对象的状态发生改变时,所以依赖于它的对象都要得到通知并且自动更新适用性:一个对象依赖于另外一个对象时,将这两者封装在独立的对象中以使它们各自独立地改变和使用当对一个对象的改变需要同时改变其它对象而不知道具体有多少对象有待改变当一个对象必须通知其它对象,而它又不能假设其它对象是谁。换言之,你不希望这些对象时紧密耦合的。示例图:mvc模式示例代码:(mvc模式略…) 阅读全文
posted @ 2011-05-15 22:54 Yarkin 阅读(308) 评论(0) 推荐(0) 编辑
摘要: 意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态。一个备忘录(Memento)是一个对象,它存储另一个对象在某个瞬间的内部状态,而后者称为备忘录的原发器(Originator)适用性:必须保持某个对象在某个时刻的状态如果一个用接口来让其它对象这节得到这些状态,将会暴露对象的实现细节并破坏对象的封装性示例图:示例代码://线条类class CLine{public: CLine(LineState STATE);public: ~CLine(void);public: //移动到目标位置 void MoveTo(POINT 阅读全文
posted @ 2011-05-15 22:45 Yarkin 阅读(173) 评论(0) 推荐(0) 编辑
摘要: 意图:用一个中介对象来封装一系列的独享交互。中介者使得各对象不需要显式的相互引用,从而使得其耦合松散,而且可以独立的改变他们之间的交互.适用性:一组对象以定义好,但是通信复杂,相互依赖关系结构混乱一个对象引用其他对象并且直接通信想定制一个分布在多个类中的行为,但是又不想定义多个子类示例图:示例程序://信息变化之后通知中介者,中介者来调用相关对象进行相应的控制class CMediator{public: CMediator();public: ~CMediator(void); public: void InfoChanged(int id) { m_PTitle->SetId(id) 阅读全文
posted @ 2011-05-15 16:36 Yarkin 阅读(148) 评论(0) 推荐(0) 编辑
摘要: 意图:提供一种方法顺序访问一个聚合对象中各个元素,而不需要暴露该对象的内部表示适用性:访问一个聚合类而无需暴露它的内部表示支持对聚合对象的多种遍历为遍历不同的聚合结构提供一个统一的接口示例图:示例代码:个人观点可以参见stl的list/set/map等…. 阅读全文
posted @ 2011-05-15 15:46 Yarkin 阅读(114) 评论(0) 推荐(0) 编辑
摘要: 意图:给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。如果一种特定类型的问题发生的频率足够高,那么就可值得将该问题的各个实例表述为一个简单语言的句子,这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。解释器模式使用类来表达每一条文法规则,在规则右边的符号是这些类的实例变量。适用性:当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树,可以使用解释器模式。而当存在以下情况时该模式效果最好l 该文法的类层次结构变得庞大而无法管理。此时语法分析程序生成器这样的工具是最好的选择。他们无需构建抽象语法树即可解释表达式,这样可以节省 阅读全文
posted @ 2011-05-15 15:21 Yarkin 阅读(209) 评论(0) 推荐(0) 编辑
摘要: 意图:用原型示例指定创建对象的种类,通过拷贝这些原型创建新的对象适用性:当实例化的类是在运行时指定时为了避免创建一个与产品类平行的工厂类当一个类的示例只能有几个不同状态组合中的一种时示例图:示例代码:#pragma once//孙悟空一变二二变四…class CMonkeyKing{public: CMonkeyKing(int i);public: ~CMonkeyKing(void); public: void Display() { if(m_i==0) { _tprintf(_T("Stone monkey/n")); } if(m_i ==1) { _tprint 阅读全文
posted @ 2011-05-14 11:27 Yarkin 阅读(122) 评论(0) 推荐(0) 编辑
摘要: 意图:定义一个用于创建对象的接口,让子类决定实例化哪个类适用性:当一个类不知道它所必须创建的类的对象时当一个类希望由它的子类来制定它所创建的对象的时候当类将创建对象的职责委托给多个帮助子类的一个是,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候示例图:示例代码: //工厂根据产品id生产产品class CFactory{public: CFactory(void);public: ~CFactory(void); public: static CProduct* Create(int id) { if(id ==0) { return new CPen(); } }};//通过模板方. 阅读全文
posted @ 2011-05-14 11:02 Yarkin 阅读(161) 评论(0) 推荐(0) 编辑
摘要: 意图:讲一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或者记录请求日志,以及支持可撤销的操作.通过将请求本身变成一个对象来使工具箱对象可向未指定的应用对象提出请求适用性:抽象出待执行的动作以参数化某对象,可以通过回调函数表达这种参数化支持取消操作(UnExecute)示例图:示例代码:#pragma once#include "Move.h"//command基类提供Execute接口class CBaseCommand{public: CBaseCommand(void);public: ~CBaseCommand(void); virtual 阅读全文
posted @ 2011-05-14 10:34 Yarkin 阅读(168) 评论(0) 推荐(0) 编辑
摘要: 意图:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递请求,直到一个对象处理它为止.适用性:有多个对象可以处理一个请求,那个对象处理该请求运行时自动确定你想在不明确制定接受者的情况下,向多个对象中的一个提交一个请求可处理一个请求的对象集合应被动态指定示例图:示例代码:class CHandler{public: CHandler(CHandler* nextHandler);public: ~CHandler(void); public: void HandleRequest(CRequest req) { if(IsMatch(r 阅读全文
posted @ 2011-05-14 09:52 Yarkin 阅读(250) 评论(0) 推荐(0) 编辑
摘要: 意图:为其他对象提供一种代理以控制对这个对象的访问动机:为了只有在我们确实需要这个对象时才对它进行创建和初始化用一个proxy替代那个对象并在需要的时候实例化这个对象适用性:在需要用比较通用和复杂的对象指针代替简单的指针的时候,使用代理(Proxy)模式示例图:听众听人演讲,演讲者通过扩音器来演说,扩音器起来的了一个中间代理的作用.示例代码://演讲者基类class CSpeaker{public: CSpeaker(void);public: ~CSpeaker(void); public: //演说接口 virtual void Speak()=0;};//英文演说家class CEngl 阅读全文
posted @ 2011-05-13 00:16 Yarkin 阅读(176) 评论(0) 推荐(0) 编辑