提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
模板方法模式、命令模式、策略模式、观察者模式
模板方法模式:是将一些事件按照给定的模板进行下去,共用相似的部分,重写不同的部分。 例如:泡茶和冲咖啡,有一些相同的步骤,比如加水,倒入杯子是相同的步骤。
#include <iosteram> using namespace std; class MakeDrink{ public: virtual void AddWater(){ cout << "加水" << endl; } virtual void AddOther() = 0; virtual void PutInCup(){ cout << "倒入杯子" << endl; } void make(){ AddWater(); AddOther(); PutInCup(); } }; class MakeTea: public MakeDrink{ public: virtual void AddOther(){ cout << "加入茶叶" << endl; } }; class MakeCoffee: public MakeDrink{ public: virtual void AddOther(){ cout << "加入咖啡" << endl; } }; int main() { MakeDrink* makeTea = new MakeTea; makeTea->make(); MakeDrink* makeCoffee = new MakeCoffee; makeCoffee->make(); return 0; }命令模式:像执行命令一样,发出命令才执行。 例如:医院等号看病,护士登记病人,挨个叫号去看病
#include <iostream> #include <queue> using namespace std; //医生类 class Doctor{ public: void treatEye(){ cout << "医生治疗了眼睛" << endl; } void treatNose(){ cout << "医生治疗了鼻子" << endl; } }; //患者类,被治疗 class Patient{ public: Patient(Doctor* d) :doctor(d){} virtual void treat() = 0; protected: Doctor* doctor; }; //眼疾患者类 class EyePatient : public Patient{ public: EyePatient(Doctor* d) :Patient(d){} virtual void treat(){ doctor->treatEye(); } }; //鼻子患者类 class NosePatient : public Patient{ public: NosePatient(Doctor* d) :Patient(d){} virtual void treat(){ doctor->treatNose(); } }; //护士类,命令医生治疗患者 class Nurse{ public: //登记患者 void addPatient(Patient* p){ m_queue.push(p); } //通知治疗后删除记录 void notify(){ while (!m_queue.empty()){ m_queue.front()->treat(); m_queue.pop(); } } private: queue<Patient*> m_queue; }; int main() { Doctor* d = new Doctor; Patient* p1 = new EyePatient(d); Patient* p2 = new NosePatient(d); Nurse* nurse = new Nurse; nurse->addPatient(p1); nurse->addPatient(p2); nurse->notify(); return 0; }策略模式:使用不同的策略,达到相同的目的。 例如:商城搞促销活动,上午全场八折,下午全场满200减100,两种不同的促销策略,都是为了达到促销的目的;枪击游戏可以用刀或枪击打目标,使用不同的武器打击目标。
#include <iostream> using namespace std; class Weapon{ public: virtual void attack() = 0; }; class Gun: public Weapon{ public: virtual void attack(){ cout << "使用枪打击目标" << endl; } }; class Knife: public Weapon{ public: virtual void attack(){ cout << "使用小刀攻击目标" << endl; } }; //任务配置武器攻击 class Hero{ public: void selectWeapon(Weapon* w){ this->w = w; } void fight(){ w->attack(); } private: Weapon* w; }; int main() { Hero* h = new Hero; Weapon* w1 = new Knife; Weapon* w2 = new Gun; h->selectWeapon(w1); h->fight(); h->selectWeapon(w2); h->fight(); return 0; }观察者模式:类似与QT下的信号与槽机制,通知后改变行为。 例如:班长放哨,其他学生没有学习,老师来了通知其他学生赶紧学习。
#include <iostream> #include <list> #include <string> using namespace std; //抽象的监听类,等待通知 class Listener{ public: virtual void doing() = 0; virtual void teacherComing() = 0; }; //学生 class Student : public Listener{ public: Student(string name, string thing){ this->name = name; this->thing = thing; } virtual void doing(){ cout << name << "正在" << thing << endl; } virtual void teacherComing(){ cout << name << "从" << thing << "变为学习" << endl; } private: string name; string thing; }; //抽象的通知者 class Notifiler{ public: virtual void addListener(Listener* l) = 0; virtual void delListener(Listener* l) = 0; virtual void notify() = 0; }; //班长 class Monitor : public Notifiler{ public: virtual void addListener(Listener* l){ m_list.push_back(l); } virtual void delListener(Listener* l) { m_list.remove(l); } virtual void notify(){ for (auto it = m_list.begin(); it != m_list.end(); ++it){ (*it)->teacherComing(); } } private: list<Listener*> m_list; }; int main() { Listener* s1 = new Student("张三", "打架"); Listener* s2 = new Student("李四", "吃零食"); Listener* s3 = new Student("王五", "打游戏"); s1->doing(); s2->doing(); s3->doing(); Notifiler* m = new Monitor; m->addListener(s1); m->addListener(s2); m->addListener(s3); m->notify(); return 0; }