命令模式
命令模式是一个比较难理解的模式,我看了好久、查阅了很多博客,根据我自己的理解记录如下:
命令模式:将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化
举例子:一个餐厅有广东厨师负责烧广东菜、四川厨师负责烧四川菜,一个服务员负责点菜、传菜;
那么他的整个运行流程是这样的,服务员记录客人点的菜----》通知后厨师傅开始做菜–》后厨师傅开始做自己负责的菜。
代码如下:其核心就是这个流程:整个运行流程是这样的,服务员记录客人点的菜----》通知后厨师傅开始做菜–》后厨师傅开始做自己负责的菜。
#include<iostream>
#include<list>
using namespace std;
//将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化
//厨师类
class C_COOK
{
public:
virtual void docooking(){cout<<"111111111"<<endl;}
};
//广东厨师
class GuangDongCook: public C_COOK
{
public:
virtual void docooking()
{
cout<<"广东菜,淡、淡、淡"<<endl;
}
};
//四川厨师
class SiChuanCook: public C_COOK
{
public:
virtual void docooking()
{
cout<<"四川菜,辣、辣、辣"<<endl;
}
};
//菜点
class Food
{
public:
virtual void cook(){}
};
//广东菜
class Guangdongfood : public Food
{
private:
C_COOK *m_cook;
public:
Guangdongfood(C_COOK *p_cook):m_cook(p_cook){}
void cook()
{
m_cook->docooking();
}
};
//四川菜
class SiChuanfood : public Food
{
private:
C_COOK *m_cook;
public:
SiChuanfood(C_COOK *p_cook):m_cook(p_cook){}
void cook()
{
m_cook->docooking();
}
};
//服务员
class Waiter
{
list<Food*>ls;
public:
void SetOrder(Food *p_food)
{
ls.push_back(p_food);
}
void POST()
{
list<Food*>::iterator itr = ls.begin();
for(;itr!=ls.end();++itr)
{
std::cout<<typeid(*itr).name()<<endl;//打印出来类型,在这里还是Food *类型
(*itr)->cook();//对应的师傅开始做菜
//在此处调用开始出现多态,
//第一次push进来的是 Food *sifood = new SiChuanfood(m_suicook);
//实际类型是 SiChuanfood * 当调用时进行RTTI运行时类型识别 识别为SiChuanfood*
//进而调用 cout<<"四川菜,辣、辣、辣"<<endl;
}
}
};
int main()
{
C_COOK *m_suicook = new SiChuanCook();
C_COOK*m_gdcook = new GuangDongCook();
Food *sifood = new SiChuanfood(m_suicook);
Food*gdfood = new Guangdongfood(m_gdcook);
Waiter xiaoli;
xiaoli.SetOrder(sifood);//记录
xiaoli.SetOrder(gdfood);//记录
xiaoli.POST();//通知
return 0;
}
输出如下
class Food *
四川菜,辣、辣、辣
class Food *
广东菜,淡、淡、淡
请按任意键继续. . .
如果要是再增加一个湖南菜,这时需要加一个湖南菜的类和湖南厨师类,代码如下
#include<iostream>
#include<list>
using namespace std;
//将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化
//厨师类
class C_COOK
{
public:
virtual void docooking(){cout<<"111111111"<<endl;}
};
//广东厨师
class GuangDongCook: public C_COOK
{
public:
virtual void docooking()
{
cout<<"广东菜,淡、淡、淡"<<endl;
}
};
//四川厨师
class SiChuanCook: public C_COOK
{
public:
virtual void docooking()
{
cout<<"四川菜,辣、辣、辣"<<endl;
}
};
//湖南厨师
class HUnanCook: public C_COOK
{
public:
virtual void docooking()
{
cout<<"湖南菜,贼辣、贼辣、贼辣"<<endl;
}
};
//菜点
class Food
{
public:
virtual void cook(){}
};
//广东菜
class Guangdongfood : public Food
{
private:
C_COOK *m_cook;
public:
Guangdongfood(C_COOK *p_cook):m_cook(p_cook){}
void cook()
{
m_cook->docooking();
}
};
//四川菜
class SiChuanfood : public Food
{
private:
C_COOK *m_cook;
public:
SiChuanfood(C_COOK *p_cook):m_cook(p_cook){}
void cook()
{
m_cook->docooking();
}
};
//新增
//湖南菜
class Hunanfood : public Food
{
private:
C_COOK *m_cook;
public:
Hunanfood(C_COOK *p_cook):m_cook(p_cook){}
void cook()
{
m_cook->docooking();
}
};
//服务员
class Waiter
{
list<Food*>ls;
public:
void SetOrder(Food *p_food)
{
ls.push_back(p_food);
}
void POST()
{
list<Food*>::iterator itr = ls.begin();
for(;itr!=ls.end();++itr)
{
std::cout<<typeid(*itr).name()<<endl;//打印出来类型,在这里还是Food *类型
(*itr)->cook();//在此处调用开始出现多态,
//第一次push进来的是 Food *sifood = new SiChuanfood(m_suicook);
//实际类型是 SiChuanfood * 当调用时进行RTTI运行时类型识别 识别为SiChuanfood*
//进而调用 cout<<"四川菜,辣、辣、辣"<<endl;
}
}
};
int main()
{
C_COOK *m_suicook = new SiChuanCook();
C_COOK*m_gdcook = new GuangDongCook();
C_COOK*m_hncook = new HUnanCook();
Food *sifood = new SiChuanfood(m_suicook);
Food*gdfood = new Guangdongfood(m_gdcook);
Food*hnfood = new Hunanfood(m_hncook);
Waiter xiaoli;
xiaoli.SetOrder(sifood);
xiaoli.SetOrder(gdfood);
xiaoli.SetOrder(hnfood);
xiaoli.POST();
return 0;
}
结果如下
class Food *
四川菜,辣、辣、辣
class Food *
广东菜,淡、淡、淡
class Food *
湖南菜,贼辣、贼辣、贼辣
请按任意键继续. . .