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("小二,来一碗米饭,来一杯热水 "); 21 } 22 virtual void sleep() 23 { 24 printf("翻来覆去睡不着~~~ "); 25 } 26 virtual void writeCode() 27 { 28 printf("老大,你饶了我,不想写代码... "); 29 } 30 }; 31 32 // 健康状态 33 class HealthStatus :public Status 34 { 35 public: 36 virtual void eat() 37 { 38 printf("小二,来两碗米饭,在来一瓶牛栏山 "); 39 } 40 virtual void sleep() 41 { 42 printf("呼呼~~~ "); 43 } 44 virtual void writeCode() 45 { 46 printf("hello,world! "); 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(" ----- 健康状态 ---- "); 101 p.eat(); 102 p.sleep(); 103 p.writeCode(); 104 105 printf(" ----- 生病状态 ---- "); 106 p.setStatus(p.getIllStatus()); 107 p.eat(); 108 p.sleep(); 109 p.writeCode(); 110 system("pause"); 111 return 0; 112 }