zoukankan      html  css  js  c++  java
  • 浅谈状态模式

    摘抄:https://www.cnblogs.com/wxmwanggood/p/9288264.html

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

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

    将与特点状态相关的行为局部化,并且将不同状态的行为分割开来!

    1 // State.cpp : 定义控制台应用程序的入口点。
      2 //
      3 
      4 #include "stdafx.h"
      5 #include<iostream>
      6 #include <string>
      7 using namespace std;
      8 class Worker;
      9 class State;
     10 class StateOne;
     11 class StateTwo;
     12 
     13 class Worker
     14 {
     15 public:
     16     Worker();
     17     ~Worker();
     18     void dothing();
     19     int getHour() {
     20         return hour;
     21     }
     22     void setHour(int hour) {
     23         this->hour = hour;
     24     }
     25     State* getCurState() {
     26         return state;
     27     }
     28     void setState(State* state) {
     29         this->state = state;
     30     }
     31 private:
     32     int hour;
     33     State* state;
     34 };
     35 
     36 class State
     37 {
     38 public:
     39     virtual ~State() {}
     40     virtual void dothing(Worker* worker) = 0;
     41 };
     42 
     43 class StateOne:public State
     44 {
     45 public:
     46     virtual void dothing(Worker* worker); 
     47 };
     48 
     49 class StateTwo:public State
     50 {
     51 public:
     52     virtual void dothing(Worker* worker); 
     53 };
     54 
     55 void StateOne::dothing(Worker* worker) {
     56     int h = worker->getHour();
     57     if (h == 7 || h == 8) {
     58         cout << "eat" << endl; 
     59     } else {
     60         delete worker->getCurState();
     61         worker->setState(new StateTwo);
     62         worker->getCurState()->dothing(worker); 
     63     }
     64 }
     65 
     66 void StateTwo::dothing(Worker* worker) {
     67     int h = worker->getHour();
     68     if (h >= 9) {
     69         cout << "work" << endl; 
     70     } else {
     71         delete worker->getCurState();
     72         worker->setState(new StateTwo);
     73         worker->getCurState()->dothing(worker); 
     74     }
     75 }
     76 
     77 Worker::Worker() {
     78     state = new StateOne;
     79 }
     80 
     81 Worker::~Worker() {
     82     if (state != NULL){
     83         delete state;
     84         state = NULL;
     85     }
     86 }
     87 
     88 void Worker::dothing() {
     89     state->dothing(this);
     90 }
     91 
     92 int _tmain(int argc, _TCHAR* argv[])
     93 {
     94     cout<<"状态模式"<<endl;
     95     Worker* w = new Worker;
     96     w->setHour(7);
     97     w->dothing();
     98 
     99     w->setHour(10);
    100     w->dothing();
    101 
    102     delete w;
    103     system("pause");
    104     return 0;
    105 }
    说白了,就是根据不同的参数(条件)调用不同对象的统一的接口,跟动态路由很像(个人理解)。好比一个web api,小于20岁的调用a对象,大于等于20岁的调用b对象,a与b接口相同,实现不同。
  • 相关阅读:
    ArcGIS for Android示例解析之高亮要素-----HighlightFeatures
    ArcGIS Runtime for Android开发教程V2.0(8)基础篇-----地图事件
    ArcGIS for Android示例解析之空间查询-----QueryTask
    ArcGIS for Android地图控件的5大常见操作
    ArcGIS Runtime for Android开发教程V2.0(4)基础篇---MapView
    ArcGIS for Android 中MapView的地图背景设置
    使用Arcglobe 10与3dmax建立三维城市
    使用PowerDesigner建立数据库模型
    一步一步学Remoting系列文章
    App集成支付宝
  • 原文地址:https://www.cnblogs.com/jylz/p/10642928.html
Copyright © 2011-2022 走看看