23种设计模式之(二十一)状态者模式(State)
本文主要介绍23种设计模式之状态模式,附详细python/c++示例代码。
- 概念
- 应用场景
- 注意事项
- 代码示例
- 总结
- 代码链接
状态模式(State)
概念
状态模式,是行为设计模式的一种。State模式允许通过改变对象的内部状态而改变对象的行为,这个对象表现得就好像修改了它的类一样。
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转译到表现不同状态的一系列类当中,可以把复杂的判断逻辑简化。
GoF对状态模式的定义是:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。
应用场景
(1)、行为随状态改变而改变的场景。
(2)、条件、分支语句的代替者。
C++代码示例
/************************************************************************/
/* 设计模式专题
/*
/* 状态模式
/*
/* Author : zzl
/*
/* 编程环境: window10 vs2010
/*
/* Date : 20180918
/************************************************************************/
#include <iostream>
class Worker;
class State
{
public:
virtual void doSomeThing(Worker *w) = 0;
};
class Worker
{
public:
Worker();
int getHour()
{
return m_hour;
}
void setHour(int hour) //改变状态 7
{
m_hour = hour;
}
State* getCurrentState()
{
return m_currstate;
}
void setCurrentState(State* state)
{
m_currstate = state;
}
void doSomeThing() //
{
m_currstate->doSomeThing(this);
}
private:
int m_hour;
State *m_currstate; //对象的当前状态
};
class State1 : public State
{
public:
void doSomeThing(Worker *w);
};
class State2 : public State
{
public:
void doSomeThing(Worker *w);
};
void State1::doSomeThing(Worker *w)
{
if (w->getHour() == 7 || w->getHour()==8)
{
printf("eat breakfast\n");
}
else
{
delete w->getCurrentState(); //状态1 不满足 要转到状态2
w->setCurrentState(new State2 );
w->getCurrentState()->doSomeThing(w); //
}
}
void State2::doSomeThing(Worker *w)
{
if (w->getHour() == 9 || w->getHour()==10)
{
printf("work \n");
}
else
{
delete w->getCurrentState(); //状态2 不满足 要转到状态3 后者恢复到初始化状态
w->setCurrentState(new State1); //恢复到当初状态
printf("current time %d undefined \n" ,w->getHour());
}
}
Worker::Worker()
{
m_currstate = new State1;
}
void main()
{
Worker *w1 = new Worker;
w1->setHour(7);
w1->doSomeThing();
w1->setHour(9);
w1->doSomeThing();
delete w1;
}
python代码示例
# -*- coding: utf-8 -*-
###################################################################
# 设计模式专题
#
# 状态模式
#
# Author : zzl
#
# 编程环境: window10 python2.7
#
# Date : 20180918
##################################################################
class State(object):
def do_something(self, worker):
pass
class Worker():
def __init__(self):
self.m_hour = 0
self.m_currstate = State1()
def do_something(self):
self.m_currstate.do_something(self)
class State1(State):
def do_something(self, worker):
if (worker.m_hour == 7 or worker.m_hour == 8):
print("eat breakfast")
else:
# 状态1不满足要转到状态2
worker.m_currstate = State2()
worker.m_currstate.do_something(worker)
class State2(State):
def do_something(self, worker):
if (worker.m_hour == 9 or worker.m_hour == 10):
print("work")
else:
# 状态2不满足要转到状态3后者恢复到初始化状态
worker.m_currstate = State1() # 恢复到当初状态
print("current time %d undefined ", worker.m_hour)
if __name__ == "__main__":
worker = Worker()
worker.m_hour = 7
worker.do_something()
worker.m_hour = 9
worker.do_something()