• 大话设计模式-状态模式


    状态模式:

    概念:当一个对象的内部状态改变时,允许改变其行为,这个对象看起来像是改变了其类。

    状态模式主要解决的是当控制一个对象状态的转换条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。

    应用场景:当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时。

     1 //State.h
     2 #ifndef STATE  
     3 #define STATE  
     4 extern class Work;
     5 class State
     6 {
     7 public:
     8     State(){};
     9     virtual void writeProgram(Work* w){};
    10 };
    11 class ForenoonState:public State
    12 {
    13 public:
    14     void writeProgram(Work* w);
    15 };
    16 
    17 class NoonState:public State
    18 {
    19 public:
    20     void writeProgram(Work* w);
    21 };
    22 class AfternoonState:public State
    23 {
    24 public:
    25     void writeProgram(Work* w);
    26 };
    27 class EveningState:public State
    28 {
    29 public:
    30     void writeProgram(Work* w);
    31 };
    32 class SleepingState:public State
    33 {
    34 public:
    35     void writeProgram(Work* w);
    36 };  
    37 class RestState:public State
    38 {
    39 public:
    40     void writeProgram(Work* w);
    41 };  
    42 #endif  
     1 //State.cpp
     2 #include <iostream>  
     3 #include "State.h"  
     4 #include "Work.h"  
     5 
     6 using namespace std;  
     7 
     8 void ForenoonState::writeProgram(Work* w)  
     9 {  
    10     if(w->getHour()<12)  
    11     {  
    12         cout<<"当前时间:"<<w->getHour()<<""<<"上午工作,精神百倍"<<endl;  
    13     }  
    14     else  
    15     {  
    16         w->setState(new NoonState);  
    17         w->writeProgram();  
    18     }  
    19 }  
    20 
    21 void NoonState::writeProgram(Work* w)  
    22 {  
    23     if(w->getHour()<13)  
    24     {  
    25         cout<<"当前时间:"<<w->getHour()<<""<<"饿了,午饭;犯困,午休"<<endl;  
    26     }  
    27     else  
    28     {  
    29         w->setState(new AfternoonState);  
    30         w->writeProgram();  
    31     }  
    32 }  
    33 
    34 void AfternoonState::writeProgram(Work* w)  
    35 {  
    36     if(w->getHour()<17)  
    37         cout<<"当前时间:"<<w->getHour()<<""<<"下午状态还不错,继续努力"<<endl;  
    38     else  
    39     {  
    40         w->setState(new EveningState);  
    41         w->writeProgram();  
    42     }  
    43 }  
    44 
    45 void EveningState::writeProgram(Work* w)  
    46 {  
    47     if(w->getFinish())  
    48     {  
    49         w->setState(new RestState);  
    50         w->writeProgram();  
    51     }  
    52     else  
    53     {  
    54         if(w->getHour()<21)  
    55             cout<<"当前时间:"<<w->getHour()<<""<<"加班哦,疲惫至极"<<endl;  
    56         else  
    57         {  
    58             w->setState(new SleepingState);  
    59             w->writeProgram();  
    60         }  
    61     }  
    62 }  
    63 
    64 void SleepingState::writeProgram(Work* w)  
    65 {  
    66     cout<<"当前时间:"<<w->getHour()<<""<<"不行了,睡着了"<<endl;  
    67 }  
    68 
    69 void RestState::writeProgram(Work* w)  
    70 {  
    71     cout<<"当前时间:"<<w->getHour()<<""<<"下班回家了"<<endl;  
    72 }  
     1 //Work.h
     2 #ifndef WORK  
     3 #define WORK  
     4 
     5 #include "State.h"  
     6 
     7 
     8 class Work  
     9 {  
    10 private:  
    11     State* current;  
    12 
    13     double Hour;  
    14     bool finish;  
    15 
    16 public:  
    17     Work();  
    18     ~Work();  
    19 
    20     double getHour();  
    21     void setHour(double HOUR);  
    22 
    23     bool getFinish();  
    24     void setFinish(bool FINISH);  
    25 
    26     void setState(State* s);  
    27 
    28     void writeProgram();  
    29 };  
    30 
    31 #endif  
     1 //Work.cpp
     2 #include "Work.h"  
     3 
     4 
     5 Work::Work()  
     6 {  
     7     current=new ForenoonState;  
     8     Hour=9;  
     9     finish=false;  
    10 }  
    11 
    12 Work::~Work()  
    13 {  
    14     if(current!=0)  
    15         delete current;  
    16 }  
    17 
    18 double Work::getHour()  
    19 {  
    20     return Hour;  
    21 }  
    22 void Work::setHour(double HOUR)  
    23 {  
    24     Hour=HOUR;  
    25 }  
    26 
    27 bool Work::getFinish()  
    28 {  
    29     return finish;  
    30 }  
    31 void Work::setFinish(bool FINISH)  
    32 {  
    33     finish=FINISH;  
    34 }  
    35 
    36 void Work::setState(State* s)  
    37 {  
    38     if(current!=0)  
    39         delete current;  
    40 
    41     current=s;  
    42 }  
    43 
    44 void Work::writeProgram()  
    45 {  
    46     current->writeProgram(this);  
    47 } 
     1 //main.cpp
     2 #include <iostream>  
     3 #include <cstdlib>  
     4 #include "Work.h"  
     5 //#include "State.h"  
     6 
     7 using namespace std;  
     8 
     9 void main()  
    10 {
    11 
    12     Work emergencyProjects; 
    13     emergencyProjects.setHour(9); 
    14     emergencyProjects.writeProgram(); 
    15     emergencyProjects.setHour(10);
    16     emergencyProjects.writeProgram();
    17     emergencyProjects.setHour(12);
    18     emergencyProjects.writeProgram();
    19     emergencyProjects.setHour(13);
    20     emergencyProjects.writeProgram();
    21     emergencyProjects.setHour(14);
    22     emergencyProjects.writeProgram();
    23     emergencyProjects.setHour(17);
    24     emergencyProjects.writeProgram();
    25     emergencyProjects.setFinish(false);
    26     emergencyProjects.setHour(19);
    27     emergencyProjects.writeProgram();
    28     emergencyProjects.setHour(22);
    29     emergencyProjects.writeProgram();
    30     system("pause");  
    31 }  
  • 相关阅读:
    CSS选择符-----关系选择符
    CSS选择符-----元素选择符
    jQuery效果--show([speed,[easing],[fn]])和hide([speed,[easing],[fn]])
    大型网站架构系列:电商网站架构案例
    大型网站架构系列:负载均衡详解(上)
    JBOSS集群和安装
    webwork或Struts配置网站根路径的默认页面办法
    SQL Server 删除重复记录,只保留一条记录
    删除JBOSS eap4.3下的jmx-console、web-console、ws-console、status服务
    SLF4J versions 1.4.0 and later requires log4j 1.2.12 or later 终极解决
  • 原文地址:https://www.cnblogs.com/zhangjxblog/p/8949415.html
Copyright © 2020-2023  润新知