备忘录模式
允许在不暴露对象实现细节的情况下,将对象恢复到之前的状态。 快照对象应该是不可变对象,仅被初始化一次 快照发起者可以实现restore(Momento* m)方法,也可以由快照实现restore()方法。后者可以将快照对象与照看者对象(CareTaker)解耦。 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354class Editor { private: std::string text; int curX, curY, selectionWidth; public: void setText(std::string t) { text = t; } void setCursor(int x, int y) { curX = x; curY = y; } void setSelectionWdith(i...
中介者模式
组件之间存在复杂依赖的时候,可以构造一个中介者统一管理组件之间的通讯。 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960class Mediator { public: virtual ~Mediator() {} virtual void notify(Component* sender, std::string event) = 0; };class AuthenticationDialog: public Mediator { private: std::string title; Checkbox *loginOrRegisterChkBx; Textbox *loginUsername, *loginPassword; Textbox *registrationUsername, *registrationPa...
迭代器模式
迭代器模式用于访问组合对象。迭代器知晓组合对象的内部结构,将迭代的实现细节屏蔽在迭代器内部,而组合对象本身不负责遍历。 迭代器模式允许外部遍历整个对象而不暴露组合对象的内部实现。 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970class SocialNetwork { public: virtual ProfileIterator* createFriendsIterator(int profileId) const = 0; virtual ProfileIterator* createCoworkersIterator(int profileId) const = 0; virtual ~SocialNetwork() {}};class Facebook: public SocialNetwork ...
命令模式
把请求封装成一个对象,从而分离请求发起和执行。发起者和执行者之间通过命令对象进行沟通,便于请求对象的储存、传递、调用、增加和管理。 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115class Command { protected: Application* app_; Editor* editor_; std::string backup_; public: Command(Application* app, Editor* editor): app_(app), editor_(editor) {} ...
责任链模式
通常而言,责任链模式涉及到一个共同的接口或抽象类,各个实际处理类继承该接口并持有下一个处理器的引用。 但是下面这个例子将给出一个在GUI设计中的特殊责任链实现模式,通过子组件对父组件的继承关系自然形成引用。下面的设计通过Container* container指针实现了链路,同时,向上传递的过程被抽象出来,安插在Component类中。 这种实现方式是将所有业务逻辑全部包含在类内部的思路,它更加清晰,但同时也缺乏可扩展性。 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253class ComponentWithContextualHelp { public: virtual void showHelp() const = 0; virtual ~ComponentWithContextualHelp() {}};class Component: public ComponentWi...
享元模式
flyweight pattern 实例的属性可分为两种: 内在状态intrinsic state:可以被共享的状态 外在状态extrinsic state:不可被共享的状态,经常被外部实例更改 享元模式的本质是,抽取公共属性作为单独的类,以静态形式存储。每个实例都拥有这个公共属性的指针。也即“共享”一部分“元数据”。 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647class TreeType { std::string name_; std::string color_; std::string texture_; public: TreeType(std::string name, std::string color, Texture texture): name_(name), color_(color), texture_(texture) {} void draw(const Canvas&...
外观模式
外观/门面facade模式可以将应用与一个复杂的第三方库简单地连接起来,尤其是应用只依赖于复杂第三方库的一小部分功能的时候。它有四个部分 Facade Additional Facade: 继承Facade并为Facade添加一些其他功能,而不改变Facade这一简单接口本身 The Complex system client 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455// a complex 3rd party video conversion frameworkclass VideoFile { // ...}class OggCompressionCodec { // ...}class MPEG4CompressionCodec { // ...}class CodecFactory { // ...}class Bitra...
桥梁模式
将“抽象化Abstraction”与“实现化Implementation”解耦。抽象的本意是将强耦合(继承)转换为弱耦合(聚合)。这里的抽象与实现不是一般程序设计下的抽象与实现 抽象:主要指高层的控制层,定义了基于“实现”的操作,如“遥控器”操作“电视机”。但是遥控器只负责发射指令,不关心指令的具体实现。 实现:抽象行为的具体执行者,比如“电视机”接受“遥控器”发出的关机指令。电视机接收指令,并负责关闭自己。 如此一来,抽象与实现就可以解耦,分别维护。 个人感觉最直观的还是类多维度解耦最直观:比如设备有电视、收音机;遥控器有基本遥控器、高级遥控器。如果用vanilla OOP的角度,需要设计4个类:电视基本遥控器、电视高级遥控器……但是使用桥接模式可以把实现(机器)绑定(聚合)给抽象(遥控器)。机器、遥控器实现相同的接口即可。 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666...
代理模式
代理模式感觉也是套一层壳。 适配器模式主要关注于解决接口的不兼容性问题,而代理模式主要关注于控制对其它对象的访问 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768class ThirdPartyYouTubeLib { public: virtual std::vector<Video> listVideos() const = 0; virtual Video getVideoInfo(int videoId) const = 0; virtual void downloadVideo(int videoId) const = 0;}class ThirdPartyYouTubeClass: public ThirdPartyYouTubeLib { public: std::vector<Vid...
装饰器模式
经典装饰器模式,装饰器本身是一种聚合aggregation。装饰器类和被装饰对象应该有共同接口(比如read和write)。在实现这些接口的时候,应该调用被装饰对象的方法。 方法可以被装饰(Python常见),同时类也可以被装饰! 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576class DataSource { public: virtual ~DataSource() {} virtual void writeData(std::string& data) const = 0; virtual std::string readData() const = 0;};class FileDataSource: public DataSource { public: ...








