摘要:解释器模式,其实就是编译原理中的语法解释器,如果用在项目中,可以用于实现动态脚本的解析,也就是说项目可以支持用户脚本扩展。 但实际上,这种运行时解释,效率很慢,如果不是很需要的话,不建议使用。 一种简单实现: Context是上下文场景,比如做一个计算器,那这个Context可以作为一个Calcul
阅读全文
摘要:迭代器模式,使用很多,但是很少实现。常用的集合都支持迭代器。集合中的CreateIterator()可用于创建自己的迭代器,在里面通过调用迭代器的构造函数Iterator(Aggregate)来绑定自己到迭代器中,如果不使用此方法,也可以在场景中直接new Iterator(Aggregate)来得...
阅读全文
摘要:责任链模式,主要是通过自己记录一个后继者来判断当前的处理情况。Handler中,再增加一个方法用于设置后继对象,如SetHandler(Handler obj)。然后Handler类以其子类的处理方法Handler()通过判断后继对象是否存在来操作:1.没有设置后继对象,自己处理事件2.有后继对象,...
阅读全文
摘要:访问者模式,通过Visitor的注入,为Element扩展了方法实现。虽然避免了Element不用修改即可修改,但却破坏了类的封装性,同时,一旦变更就需要增加子类,在子类方法中调用基类方法,然后再使用Visitor的方法来扩展。个人理解,Visitor有点类似于策略模式中的算法,都是通过组合的方法变...
阅读全文
摘要:命令模式,将具体操作Receiver封在Command中,调用类只需要知道Command即可。
阅读全文
摘要:中介者模式,A与B之间存在调用对方操作的行为,通过中介者模式,可以去除双方的强引用。如图,A可以通过代理Mediator的方法来调用B的方法,而不需要保存B的引用。
阅读全文
摘要:备忘录模式,可以将当前状态保存,并随时恢复。Originator存在状态state,当需要保存此状态时,通过CreateMemento创建一个备忘录对象Memento保存此状态;而需要恢复相应状态时,使用RestoreMemento(memento)将相应的状态恢复回来。
阅读全文
摘要:观察者模式,当事件发生时,调用相应观察者的方法进行“通知”。Subject中使用一个数据结构存储需要通知的观察者对象,执行Notify时,执行所有观察者的Update方法。
阅读全文
摘要:状态模式,主要是用于存在大量case判断的操作执行,同时这些case依赖于对象的状态,那么就可以将大量的case判断封装为独立的类。Context:-state,当前状态对象。ChangeState(state),切换state对象。OperationInterface(),调用State->Ope...
阅读全文
摘要:策略模式,与模板模式一样,都是为了将接口和算法实现解耦,但策略模式更主要是整体算法的替换,而模板模式主要是流程一致,部分算法的替换。个人理解为,一般算法替换,使用策略模式,当算法流程一致,可以提取为模板模式。实际中,策略模式,使用组合方式,将算法实现脱离上下文,上下文可以依据需要,使用不同的算法实现...
阅读全文
摘要:模板模式,主要是利用多态来实现具体算法和父类逻辑的松耦合。父类中TemplateMethod内部定义了相应的算法操作顺序,子类负责实现相应的具体实现。举例:项目中曾遇到过一个需求,叫做高级价格体系。它对外的调用接口一致,只是在不同的应用场景下(比如普通消费和会员卡消费)计算方法有差异,简化计算流程:...
阅读全文
摘要:代理模式,主要是逻辑和实现解耦。具体逻辑如何,由代理Proxy自己来设计,我们只需要把逻辑Subject交给代理即可。主要应用场景,包括创建大开销对象时,使用代理来慢慢创建;远程代理,如网络不确定时,创建一个本地代理来操作网络,完成时通知本地其他操作(有点回调的意思);控制访问,通过代理增加一些逻辑...
阅读全文
摘要:门面模式,其实在我们不经意间已经使用了此设计模式。当我们需要将两个子系统,合并对外提供一个大的接口时,我们使用的就是门面模式。对外,子系统的接口是不可见的,只有我们的门面在。
阅读全文
摘要:Flyweight模式提供对象的复用。FlyweightFactory类似工厂模式中的工厂,生成对象并提供。区别在于,享元的工厂会记录生成的对象,当第二次请求到相同的对象时,享元不会再生成一个新对象,而是直接使用已有的提供给场景。比如,享元工厂是一个武器设计院A,当陆军作为Client向A请求设计武器W,如果A没有W,那它设计出武器W(new),记录下W档案,然后把W提供给陆军。后来海军作为Client2也向A请求设计武器W,A一看,自己档案里有W了,直接把W告诉海军就完了,不用再设计一次(new)。
阅读全文
摘要:组合模式,典型的层次结构。与装饰器类图相似。区别在于:装饰器模式是为了在接口中增加方法,而组合模式在于层次元素的叠加。ConcreteComponent就是中间结点,可以包含更多的ConcreteComponent。Leaf是叶子结点。
阅读全文
摘要:装饰器模式,最典型的例子。工厂新开了流水线,生产了手机外壳,蓝天白云花色。刚准备出厂,客户说还要印奶牛在上面,WTF……时间上来不及,成本也不允许销毁了重来,怎么办?弄来一机器A,专门在蓝天白云的外壳再印奶牛。最后通过机器A的装饰,得到了有奶牛的外壳。装饰器中调用传递进来的Component的方法,同时再附加上新的方法,在保证外部接口一致的情况下,达到增加新行为的目的。简单代码,仅包含父类和装饰器: class CComponent { public CComponent() { } public virtual void O...
阅读全文
摘要:适配器模式适用于将不一致的接口转换为一致的接口。比如,去香港玩儿,带上了自己的笔记本电脑,结果晚上插电时就抓瞎了,电源插孔与插座不一致。WTF……插座是酒店装好的,不可能拆了换一个,电源是自己的,也不可能说重新买一个,只有买个转换器了。通过转换器,将我们不适配的插头转换成适配的插头。CTarget外...
阅读全文
摘要:桥接模式的目的是在设计初,就将实现与接口分离,在以后实现发生变化时,只需要改变传递的实现对象,在保持接口一致的情况,达到实现的变更。在OperationInterface中就调用实现的方法imp.Operation()PS:桥接模式与策略模式(Strategy)类图上很相似,区别在于:1.桥接模式接口与实现都可以变化,互不影响,外部关心接口以及采用的实现。比如接口类统一是绘图操作,实现类分为桌面A和手机B,二者的实现是不同的;当A增加方法时,同时可以为接口类的子类“A接口类”增加相应接口。2.策略模式接口类没有设计子类的实现,因为它只有具体实现的替换,强调“算法”。比如,实现一个用户存储类,如
阅读全文
摘要:原型模式,简单说就是具有一个克隆方法,外部可以直接使用此方法得到相应对象的拷贝对象。比如哆啦A梦的复制镜,一照,就把物品拷贝了一份(虽然是镜子复制是相反的,这里就忽略这个细节了)C++中依靠拷贝构造函数来得到拷贝。IPrototype* CPrototype::Clone() const{ r...
阅读全文
摘要:构造者模式。外部场景如果需要一个汽车类,它不需要关心如何构造,它只需要告诉Director需要什么,就可以从Director获得。如:CDirector(IBuilder* aBuilder);场景告诉Director它需要用什么类型的Builder来构造,然后就可以用Create()获得所创建的对...
阅读全文