状态模式是当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
当一个对象的状态转换需要太多的if-else或者其他的判断语句的时候,就可以用这个模式,把状态的判断逻辑转移到表示不同状态的一系列的类中,也就是把本来在一起的各个判断语句解开来。
用一个表示不同时间段程序员状态的例子:
#include <iostream>
#include <string>
using namespace std;
class work;
class state
{
public:
virtual void write_program( work *w ) {}
};
class work
{
public:
work() { finish_work = false; }
void set_state( state *s )
{
current = s;
}
void set_time( double h )
{
hour = h;
}
void work_finish()
{
finish_work = true;
}
double get_time()
{
return hour;
}
bool get_finish_work()
{
return finish_work;
}
void writeprogram()
{
current->write_program( this );
}
private:
state *current;
bool finish_work;
double hour;
};
class sleeping_state : public state
{
public:
void write_program( work *w )
{
cout << " 当前时间 " << w->get_time() << " 顶不住了,睡着了 " << endl;
}
};
class rest_state : public state
{
public:
void write_program( work *w )
{
cout << " 当前时间 " << w->get_time() << " 搞定收工下班 " << endl;
}
};
class evening_state : public state
{
public:
void write_program( work *w )
{
if( w->get_finish_work() )
{
w->set_state( new rest_state );
w->writeprogram();
}
else
{
if( w->get_time() < 21 )
{
cout << " 当前时间 " << w->get_time() << " 叫你平时不好好看书,现在加班啦 " << endl;
}
else
{
w->set_state( new sleeping_state );
w->writeprogram();
}
}
}
};
class afternoon_state : public state
{
public:
void write_program( work *w )
{
if( w->get_time() < 17 )
{
cout << " 当前时间 " << w->get_time() << " 下午了,状态还行,码代码ing " << endl;
}
else
{
w->set_state( new evening_state );
w->writeprogram();
}
}
};
class noon_state : public state
{
public:
void write_program( work *w )
{
if( w->get_time() < 13 )
{
cout << " 当前时间 " << w->get_time() << " 中午刚吃完饭,不睡不行啊 " << endl;
}
else
{
w->set_state( new afternoon_state );
w->writeprogram();
}
}
};
class forenoon_state : public state
{
public:
void write_program( work *w )
{
if( w->get_time() < 12 )
{
cout << " 当前时间 " << w->get_time() << " 状态正好着,努力码代码ing " << endl;
}
else
{
w->set_state( new noon_state );
w->writeprogram();
}
}
};
int main()
{
work *w = new work;
w->set_time( 9 );
w->set_state( new forenoon_state );
w->writeprogram();
w->set_time( 13 );
w->writeprogram();
w->set_time( 18 );
w->writeprogram();
//w->work_finish();
//w->set_time( 20 );
//w->writeprogram();
w->set_time( 22 );
w->writeprogram();
}
在代码中我们的work类就像是context类一样,刚开始的时候我们把work的对象w中的时间初始化为9点,state对象current初始化为forenoon_state,用w中的writeprogram来得出此时的状态,当时间hour改变的时候根据hour来决定要new一个什么类给w中的current,如果要想增加什么状态的话,就再写一个继承state的类,或许还要改一下相关的状态类的判断条件就行了,比起把一大堆if-else语句挤在一起来判断要好得多!