二十三、命令模式
【摘要】 命令模式
命令模式是一个比较难理解的模式,我看了好久、查阅了很多博客,根据我自己的理解记录如下: 命令模式:将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化
举例子:一个餐厅有广东厨师负责烧广东菜、四川厨师负责烧四川菜,一个服务员负责点菜、传菜; 那么他的整个运行流程是这样的,服务员记录客人点的菜----》通知后厨师傅开始做菜–》后厨师傅开始做自己负...
命令模式
命令模式是一个比较难理解的模式,我看了好久、查阅了很多博客,根据我自己的理解记录如下:
命令模式:将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化
举例子:一个餐厅有广东厨师负责烧广东菜、四川厨师负责烧四川菜,一个服务员负责点菜、传菜;
那么他的整个运行流程是这样的,服务员记录客人点的菜----》通知后厨师傅开始做菜–》后厨师傅开始做自己负责的菜。
代码如下:其核心就是这个流程:整个运行流程是这样的,服务员记录客人点的菜----》通知后厨师傅开始做菜–》后厨师傅开始做自己负责的菜。
#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 *
广东菜,淡、淡、淡
请按任意键继续. . .
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
如果要是再增加一个湖南菜,这时需要加一个湖南菜的类和湖南厨师类,代码如下
#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 *
湖南菜,贼辣、贼辣、贼辣
请按任意键继续. . .
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
文章来源: blog.csdn.net,作者:IM-STONE,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/doubleintfloat/article/details/110406759
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)