二十三、命令模式
【摘要】 命令模式
命令模式是一个比较难理解的模式,我看了好久、查阅了很多博客,根据我自己的理解记录如下: 命令模式:将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化
举例子:一个餐厅有广东厨师负责烧广东菜、四川厨师负责烧四川菜,一个服务员负责点菜、传菜; 那么他的整个运行流程是这样的,服务员记录客人点的菜----》通知后厨师傅开始做菜–》后厨师傅开始做自己负...
命令模式
命令模式是一个比较难理解的模式,我看了好久、查阅了很多博客,根据我自己的理解记录如下:
命令模式:将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化
举例子:一个餐厅有广东厨师负责烧广东菜、四川厨师负责烧四川菜,一个服务员负责点菜、传菜;
那么他的整个运行流程是这样的,服务员记录客人点的菜----》通知后厨师傅开始做菜–》后厨师傅开始做自己负责的菜。
代码如下:其核心就是这个流程:整个运行流程是这样的,服务员记录客人点的菜----》通知后厨师傅开始做菜–》后厨师傅开始做自己负责的菜。
#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 *
湖南菜,贼辣、贼辣、贼辣
请按任意键继续. . .
文章来源: blog.csdn.net,作者:IM-STONE,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/doubleintfloat/article/details/110406759
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)