定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
class TemplateDrink{ public: virtual void boilWater() = 0; virtual void drew() = 0; virtual void pourCup() = 0; virtual void addSomething() = 0; void make(){ boilWater(); drew(); pourCup(); addSomething(); } }; class Tea : public TemplateDrink{ public: void boilWater() override{ cout << "煮山泉水..." << endl; } void drew() override{ cout << "冲龙井茶..." << endl; } void pourCup() override{ cout << "倒入茶杯中..." << endl; } void addSomething() override{ cout << "加点柠檬....
有一个已经写好的接口,但是不符合需求,适配器就是将已有的接口转化为需要的形式
class MyPrint{ public: void operator()(int a, int b){ cout << a + b << endl; } }; class TargetInterface{ public: virtual void operator()(int v) = 0; }; class MyAdaptor : public TargetInterface{ public: MyAdaptor(int param):param(param){} void operator()(int v){ print(v, param); } private: MyPrint print; int param; }; MyAdaptor myBind2nd(int v){ return MyAdaptor(v); } int main() { vector<int> v; for(int i = 0; i < 10; ++i){ v.push_back(i); } for_each(v.begin(), v....
将复杂的子系统抽象到同一个接口进行管理,外界只需要通过此接口与子类系统进行交互,而不必直接与复杂的子类系统进行交互
案例:家庭影院外观模式 实现KTV模式:电视打开,灯关掉,音响打开,麦克风打开,DVD打开
实现游戏模式:电视打开,音响打开,游戏机打开
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
单例在内存中只有一份,在内存中不会占用太多,程序退出时会随着程序统一释放内存,所以可以不必特意释放 一、懒汉式 不是线程安全的,所以多线程使用要加锁
class Singleton{ public: static Singleton* getInstance(){ if(s_instance == nullptr){ s_instance = new Singleton; } return s_instance; } // 可有可无,程序结束时,系统会自动回收程序的所有内存 class Garbo{ ~Garbo(){ if(s_instance){ cout << "gc..." << endl; delete s_instance; } } }; private: Singleton(){ cout << "Singleton()..." << endl; } Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) = delete; static Singleton* s_instance; static Garbo s_gc; }; Singleton* Singleton::s_instance = nullptr; int main() { cout << "main()....