状态模式

  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 }
原文地址:https://www.cnblogs.com/dzqdzq/p/3596465.html