1 #include "stdio.h"
2 #include "stdlib.h"
3
4 // 程序员有三种行为:吃饭,睡觉,写代码。
5 // 程序员有两种状态:生病,健康
6 class Status
7 {
8 public:
9 virtual void eat() = 0;
10 virtual void sleep() = 0;
11 virtual void writeCode() = 0;
12 };
13
14 // 生病状态
15 class IllStatus :public Status
16 {
17 public:
18 virtual void eat()
19 {
20 printf("小二,来一碗米饭,来一杯热水\n");
21 }
22 virtual void sleep()
23 {
24 printf("翻来覆去睡不着~~~\n");
25 }
26 virtual void writeCode()
27 {
28 printf("老大,你饶了我,不想写代码...\n");
29 }
30 };
31
32 // 健康状态
33 class HealthStatus :public Status
34 {
35 public:
36 virtual void eat()
37 {
38 printf("小二,来两碗米饭,在来一瓶牛栏山\n");
39 }
40 virtual void sleep()
41 {
42 printf("呼呼~~~\n");
43 }
44 virtual void writeCode()
45 {
46 printf("hello,world!\n");
47 }
48 };
49
50 // 程序员
51 class Programmer
52 {
53 public:
54 Programmer()
55 {
56 m_pStatus = m_pHealthStatus; // 程序员出来的时候是健康的
57 }
58 public:
59 void eat()
60 {
61 m_pStatus->eat();
62 }
63 void sleep()
64 {
65 m_pStatus->sleep();
66 }
67 void writeCode()
68 {
69 m_pStatus->writeCode();
70 }
71 void setStatus(Status *s)
72 {
73 m_pStatus = s;
74 }
75 Status* getStatus()
76 {
77 return m_pStatus;
78 }
79 Status* getIllStatus()
80 {
81 return m_pIllStatus;
82 }
83 Status* getHealthStatus()
84 {
85 return m_pHealthStatus;
86 }
87 private:
88 static Status* m_pIllStatus;//生病状态
89 static Status* m_pHealthStatus;//健康状态
90 Status* m_pStatus; // 记录程序员的状态
91 };
92 // 这里设置静态的原因是程序员不可能只有一个,所有的程序员共享这两种状态,可以节约内存开销
93 Status* Programmer::m_pIllStatus = new IllStatus;
94 Status* Programmer::m_pHealthStatus = new HealthStatus;
95
96 // 模式说明:同一事物的不同状态会有不同的行为结果。对象看起来像是修改了类,实际上只是改变了对象的状态
97 int main()
98 {
99 Programmer p;
100 printf("\n----- 健康状态 ----\n");
101 p.eat();
102 p.sleep();
103 p.writeCode();
104
105 printf("\n----- 生病状态 ----\n");
106 p.setStatus(p.getIllStatus());
107 p.eat();
108 p.sleep();
109 p.writeCode();
110 system("pause");
111 return 0;
112 }