设计模式23-访问者模式
太过于复杂,且应用场景比较局限,个人感觉没必要掌握
设计模式22-模板方法模式
如果一个执行流程是固定的,但是具体调用的部分方法可变,即适用模板方法 123456789101112131415161718192021222324252627282930313233343536373839class Muxter {public: void DoMux() { CreateHandle(); uint8_t video_src[100]; int video_src_len = 100; uint8_t video_dst[100]; int video_src_dst = 100; uint8_t audio_src[100]; int audio_src_len = 100; uint8_t audio_dst[100]; int audio_src_dst = 100; EncVideo(video_src, video_src_len, video_dst, video_src_dst);...
设计模式21-状态模式
如果对象不同状态会去执行不同的命令,并跳转到另一个状态,那么这个状态可以抽象出一个基类 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101#include <iostream>#include <memory>#include <string>class MusicPlayer;class PlayerStatue {public: virtual ~PlayerStatue() {} virtual void play(MusicPlayer &player) = 0; virtual void pause(MusicPlayer &player...
设计模式20-策略模式
把算法做成可插拔的插件 针对同一个问题,如果需要不同的算法来解决,那么我们最好把不同的算法类提出一个抽象基类,让不同的算法来重写它提供的接口,在应用层通过基类指针来调用不同的算法 比如说不同国家有不同的税率计算方案,那么我们就可以让税率计算器持有一个抽象基类的计算方案,然后把对应国家的具体计算算法传给它 再举个例子,那么多排序算法,可以提升出一个抽象基类strategy,具体要使用哪个排序,传给实际执行排序的应用 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103#include <iostream>#include <memory>#include <vector>class strategy...
设计模式19-观察者模式
当一个对象状态发生变化时,如果多个对象希望感知这种变化,那么我们应该把这多个对象提出一个抽象基类,提供一个统一的接收变化的接口 类比现实中,很多网站有订阅消息的功能,当你同意订阅他们的消息,他们即会在合适的时候向所有订阅者包括你,发布消息 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879#include <iostream>#include <string>#include <unordered_set>class observer {public: virtual void GetMsg(std::string msg) = 0; virtual ~observer() {}};class Publiser {public: vo...
设计模式18-备忘录模式
备忘录模式 我更想称它为快照模式,它的思想就是把对象的状态保存为快照,存储到其他地方,在需要的时候拿来加载上,就可以得到当时候存快照时的样子 比如我们游戏的存档点 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798#include <iostream>#include <string>#include <vector>class ArchievePoint {public: ArchievePoint(std::string pos, int level, int money) : m_pos(pos) , m_level(level) , m_money(money) {&...
设计模式17-中介者模式
当我们有N个类需要互相沟通时,一对一的方式建立的连接数量为 N*(N-)/2 ,耦合性太高。我们应该建立一个中间节点,所有人通过这个中间节点来进行沟通,这就是中介者模式 比如国家与国家间进行交流时,建立一个联合国,大家通过这个中间人来发表声明,这时我们先抽象出一个国家基类,它定义了与中间者联合国交流的接口 1234567891011121314class UnitedNation;class AbstructCountry {public: virtual void sendMsg(Country target, std::string msg) = 0; virtual void GetMsg(Country from, std::string msg) = 0; virtual ~AbstructCountry() {} void SetUnion(UnitedNation *u) { m_u = u; } Country m_c;protected: UnitedNat...
设计模式16-迭代器模式
完全过时的东西,STL里的迭代器足够使用了,不必自己实现
设计模式15-命令模式
把要执行的动作包装为对象,可实现动作的延时执行,或撤销 C++引入 lambda表达式 以及函数对象后,这个设计模式存在的意义其实就不大了,了解设计思想即可 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485#include <iostream>#include <ostream>#include <string>#include <vector>class Chief {public: void makeGBJD() { std::cout << "宫保鸡丁已做好" << std::endl; } void makeYXRS() { ...
设计模式14-责任链模式
我只需要把请求交给我的直接上级,他能不能处理,或者他转交给他的上级处理,我不关心 我是一个职员,我的直接上级是GroupManager,再往上还有ProjectManager, CEO,我只需要把我的请求交给直接上级,他们会层层审批,直到遇到能够最终做决定的人 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374#include <iostream>#include <cstdint>enum class req: uint8_t { emRest, emLongHoliday, emResign};class abstructManager {public: void setNext(abstructManager* next) { m_next = ...









