模板方法模式
#include<iostream>
#include<string>
using namespace std;
class Resume
{
protected:virtual void writeBasicInfo() = 0;virtual void writeEducation() = 0;virtual void writeWorkExperience() = 0;public:void FillResume(){writeBasicInfo();writeEducation();writeWorkExperience();}virtual ~Resume() {};
};
class ResumeA : public Resume
{
protected:void writeBasicInfo(){cout << "简历A: 基本信息, ";}void writeEducation(){cout << "教育背景, ";}void writeWorkExperience(){cout << "工作经验 (越详细越好)." << endl;}
};
class ResumeB : public Resume
{
protected:void writeBasicInfo(){cout << "简历B: 基本信息, ";}void writeEducation(){cout << "教育背景, ";}void writeWorkExperience(){cout << "工作经验 (请简要概况)." << endl;}
};int main()
{Resume* r1 = new ResumeA;r1->FillResume();Resume* r2 = new ResumeB;r2->FillResume();delete r1;delete r2;system("pause");return 0;
}
命令模式
#include<iostream>
#include<string>
#include<vector>
using namespace std;
class Chef
{
public:void makeMeals(){cout << "正在做饭中..." << endl;}void cancelMeals(){cout << "已取消做饭!" << endl;}void makeNoodles(){cout << "正在煮面中..." << endl;}void cancelNoodles(){cout << "已取消煮面!" << endl;}
};
class Command
{
protected:Chef* chef; public:virtual void executeCommand() = 0; virtual void cancelCommand() = 0; virtual ~Command() {};
};
class AboutMealsCommand : Command
{
public:AboutMealsCommand(Chef* c){this->chef = c;}void executeCommand(){chef->makeMeals(); }void cancelCommand(){chef->cancelMeals(); }
};
class AboutNoodlesCommand : Command
{
public:AboutNoodlesCommand(Chef* c){this->chef = c;}void executeCommand(){chef->makeNoodles(); }void cancelCommand(){chef->cancelNoodles(); }
};
class Customer
{
private:vector<Command*> commandQueue; public:void add(Command* command){commandQueue.push_back(command); cout << "客人发出了一条命令" << endl;}void remove(Command* command){for (auto iter = commandQueue.begin(); iter != commandQueue.end(); iter++){if ((*iter) == command){commandQueue.erase(iter);break;}}cout << "客人取消了一条命令" << endl;}void confirm(){for (auto command : commandQueue){command->executeCommand();}commandQueue.clear();}void cancel(){for (auto command : commandQueue){command->cancelCommand();}commandQueue.clear();}
};int main()
{Chef* chef = new Chef();Command* mealsCommand = (Command*) new AboutMealsCommand(chef);Command* noodlesCommand = (Command*) new AboutNoodlesCommand(chef);Customer* customer = new Customer();customer->add(mealsCommand);customer->add(noodlesCommand);customer->remove(mealsCommand);customer->confirm();customer->add(noodlesCommand);customer->cancel();delete customer;delete chef;delete mealsCommand;delete noodlesCommand;system("pause");return 0;
}
责任链模式
#include<iostream>
#include<string>
using namespace std;
class Handler
{
protected:Handler* nextHanler; public:Handler() : nextHanler(nullptr) { cout << "初始化成功!" << endl; }void setNextHandler(Handler* next){this->nextHanler = next;}virtual void handleRequest(int days) = 0;virtual ~Handler() {};
};
class GroupLeader : public Handler
{
public:void handleRequest(int days){cout << "组长回复:";if (days <= 1){cout << "同意请假!" << endl;}else{cout << "请假太久了,你去找经理请假。" << endl;if (this->nextHanler != nullptr) nextHanler->handleRequest(days);}}
};
class Manager : public Handler
{
public:void handleRequest(int days){cout << "经理回复:";if (days <= 3){cout << "同意请假!" << endl;}else{cout << "请假太久了,你去找老板请假。" << endl;if (this->nextHanler != nullptr) nextHanler->handleRequest(days);}}
};
class Boss : public Handler
{
public:void handleRequest(int days){cout << "老板回复:";if (days <= 7){cout << "同意请假!" << endl;}else{cout << "请假太久了,不行!" << endl;if (this->nextHanler != nullptr) nextHanler->handleRequest(days);}}
};int main()
{Handler* groupLeader = new GroupLeader;Handler* manager = new Manager;Handler* boss = new Boss;groupLeader->setNextHandler(manager);manager->setNextHandler(boss);int days;days = 1;cout << "想要请假" << days << "天" << endl;groupLeader->handleRequest(days);days = 3;cout << "想要请假" << days << "天" << endl;groupLeader->handleRequest(days);days = 7;cout << "想要请假" << days << "天" << endl;groupLeader->handleRequest(days);days = 30;cout << "想要请假" << days << "天" << endl;groupLeader->handleRequest(days);delete groupLeader;delete manager;delete boss;system("pause");return 0;
}
策略模式
#include<iostream>
#include<string>
using namespace std;
class Strategy
{
public:virtual int execute(int left, int right) = 0;
};
class Add : public Strategy
{
public:int execute(int left, int right){return left + right;}
};
class Sub : public Strategy
{
public:int execute(int left, int right){return left - right;}
};
class Mul : public Strategy
{
public:int execute(int left, int right){return left * right;}
};
class Div : public Strategy
{
public:int execute(int left, int right){if (right == 0){cout << "除数不能为零!" << endl;return 0;}return left / right;}
};
class Container
{
private:Strategy* strategy; public:void setStrategy(Strategy* s){this->strategy = s;}int executeStrategy(int left, int right){return strategy->execute(left, right);}
};int main()
{Container* container = new Container;int left, right;char symbol;Strategy* strategy = nullptr;while (true){cout << "(Count) >>> ";cin >> left >> symbol >> right;switch (symbol){case '+':strategy = new Add;container->setStrategy(strategy);break;case '-':strategy = new Sub;container->setStrategy(strategy);break;case '*':strategy = new Mul;container->setStrategy(strategy);break;case '/':strategy = new Div;container->setStrategy(strategy);break;}cout << container->executeStrategy(left, right) << endl;delete strategy;}system("pause");return 0;
}
观察者模式
#include<iostream>
#include<string>
#include<vector>
using namespace std;
class Boss;
class Employee
{
private:string m_name; public:Employee(string name) : m_name(name) {};void updateInfomation(string info){cout << m_name << "收到情报:" << info << endl;if (info == "老板来了"){cout << "--> 开启工作模式" << endl;}else if (info == "老板走了"){cout << "--> 开启摸鱼模式" << endl;}}
};
class Boss
{
private:string information; vector<Employee*> employeeContainer; public:void addEmployee(Employee* employee){this->employeeContainer.push_back(employee);}void setActionInfo(string info){this->information = info; notify(); }void notify(){for (auto v : employeeContainer){v->updateInfomation(this->information); }}
};int main()
{Boss* boss = new Boss;Employee* emp1 = new Employee("小明");Employee* emp2 = new Employee("老张");Employee* emp3 = new Employee("老李");boss->addEmployee(emp1);boss->addEmployee(emp2);boss->addEmployee(emp3);boss->setActionInfo("老板来了");boss->setActionInfo("老板走了");delete boss;delete emp1;delete emp2;delete emp3;system("pause");return 0;
}
访问者模式
#include<iostream>
#include<string>
using namespace std;
class Place;
class Visitor
{
public:virtual void visitHospital(Place* place) = 0;virtual void visitResteraunt(Place* place) = 0;virtual ~Visitor() {};
};
class Place
{
protected:string placeName; public:string getName() {return this->placeName;}virtual void accept(Visitor* visitor) = 0;virtual ~Place() {}
};
class Hospital : public Place
{
public:Hospital(string name){this->placeName = name;}void accept(Visitor* visitor){visitor->visitHospital(this); }
};
class Resteraunt : public Place
{
public:Resteraunt(string name){this->placeName = name;}void accept(Visitor* visitor){visitor->visitResteraunt(this); }
};
class Doctor : public Visitor
{
public:void visitHospital(Place* place){cout << "医生访问" << place->getName() << "是为了治疗病人" << endl;}void visitResteraunt(Place* place){cout << "医生访问" << place->getName() << "是为了吃一顿饭" << endl;}
};
class Chef : public Visitor
{
public:void visitHospital(Place* place){cout << "厨师访问" << place->getName() << "是为了治病" << endl;}void visitResteraunt(Place* place){cout << "厨师访问" << place->getName() << "是为了做菜" << endl;}
};int main()
{Place* hospital = new Hospital("丽江市第一人名医院");Place* resteraunt = new Resteraunt("幸福餐馆");Visitor* doctor = new Doctor();Visitor* chef = new Chef();hospital->accept(doctor);resteraunt->accept(doctor);hospital->accept(chef);resteraunt->accept(chef);delete hospital;delete resteraunt;delete doctor;delete chef;system("pause");return 0;
}
中介者模式
#include<iostream>
#include<string>
using namespace std;class Role;
class Mediator
{
protected:Role* hr;Role* student;public:void set_HR(Role* hr){this->hr = hr;}void set_Student(Role* student){this->student = student;}virtual void match() = 0;
};
class Role
{
protected:string name; string offer; Mediator* mediator; public:string getName(){return this->name;}string getOffer(){return this->offer;}virtual void match(Role* role) = 0;
};
class Student : public Role
{
public:Student(string name, string offer, Mediator* mediator){this->name = name;this->offer = offer;this->mediator = mediator;}void match(Role* role){mediator->set_HR(role);mediator->set_Student(this);mediator->match();}
};
class HR : public Role
{
public:HR(string name, string offer, Mediator* mediator){this->name = name;this->offer = offer;this->mediator = mediator;}void match(Role* role){mediator->set_HR(this);mediator->set_Student(role);mediator->match();}
};
class LiepinApp : public Mediator
{
public:void match(){cout << "------------------" << endl;cout << hr->getName() << "提供岗位:" << hr->getOffer() << endl;cout << student->getName() << "需求职位:" << student->getOffer() << endl;if (hr->getOffer() == student->getOffer()){cout << "配对成功!" << endl;}else{cout << "配对失败!" << endl;}cout << "------------------" << endl;}
};int main()
{Mediator* app1 = new LiepinApp;Role* hr = new HR("花儿姐", "软件工程师", app1); app1->set_HR(hr); Role* student = new Student("小明", "机械工程师", app1); app1->set_Student(student); app1->match();delete app1;delete hr;delete student;system("pause");return 0;
}
备忘录模式
状态模式
迭代器模式
解释器模式