大话设计模式状态模式c++实现

状态模式

其他二十三种设计模式

#include<iostream>
using namespace std;

//状态模式
class DoWork;

//抽象状态类
class State {
    
    
public:
	virtual void WriteProgram(DoWork* _work) = 0;
};

//添加具体状态类
class ForenoonState :public State {
    
    
public:
	virtual void WriteProgram(DoWork* _work);
};
class NoonState :public State {
    
    
public:
	virtual void WriteProgram(DoWork* _work);
};
class AfternoonState :public State {
    
    
public:
	virtual void WriteProgram(DoWork* _work);
};
class EveningState :public State {
    
    
public:
	virtual void WriteProgram(DoWork* _work);
};
class SleepingState :public State {
    
    
public:
	virtual void WriteProgram(DoWork* _work);
};
class RestState :public State {
    
    
public:
	virtual void WriteProgram(DoWork* _work);
};

//工作类
class DoWork {
    
    
public:
	DoWork() {
    
    
		this->current = new ForenoonState();
	}
	void SetHour(double _hour) {
    
    
		this->hour = _hour;
	}
	double GetHour() {
    
    
		return hour;
	}
	void  SetTaskFinished(bool _finish) {
    
    
		this->finish = _finish;
	}
	bool GetTaskFinished() {
    
    
		return finish;
	}
	void SetState(State* _current) {
    
    
		this->current = _current;
	}
	void WriteProgram() {
    
    
		current->WriteProgram(this);
	}

private:
	State* current;
	double hour = 0.0;
	bool finish = false;
};

//具体状态类
void ForenoonState::WriteProgram(DoWork* _work) {
    
    
	if (_work->GetHour() < 12)
		cout << "当前时间: " << _work->GetHour() << " 点, 上午工作, 精神百倍" << endl;
	else {
    
    
		_work->SetState(new NoonState());
		_work->WriteProgram();
	}
}
void NoonState::WriteProgram(DoWork* _work) {
    
    
	if (_work->GetHour() < 13)
		cout << "当前时间: " << _work->GetHour() << " 点, 饿了,午饭;犯困,午休" << endl;
	else {
    
    
		_work->SetState(new AfternoonState());
		_work->WriteProgram();
	}
}
void AfternoonState::WriteProgram(DoWork* _work) {
    
    
	if (_work->GetHour() < 17)
		cout << "当前时间: " << _work->GetHour() << " 点, 下午状态不错,继续努力" << endl;
	else {
    
    
		_work->SetState(new EveningState());
		_work->WriteProgram();
	}
}
void EveningState::WriteProgram(DoWork* _work) {
    
    
	if (_work->GetTaskFinished()) {
    
    
		_work->SetState(new RestState());
	}
	else {
    
    
		if (_work->GetHour() < 21)
			cout << "当前时间: " << _work->GetHour() << " 点, 加班哦,疲劳至极" << endl;
		else {
    
    
			_work->SetState(new SleepingState());
			_work->WriteProgram();
		}
	}
}
void SleepingState::WriteProgram(DoWork* _work) {
    
    
	cout << "当前时间: " << _work->GetHour() << " 点,不行了,睡着了" << endl;
}
void RestState::WriteProgram(DoWork* _work) {
    
    
	cout << "当前时间: " << _work->GetHour() << " 点, 下班回家了" << endl;
}

void test1() {
    
    
	DoWork* wk = new DoWork;
	wk->SetHour(9);
	wk->WriteProgram();
	wk->SetHour(10);
	wk->WriteProgram();
	wk->SetHour(12);
	wk->WriteProgram();
	wk->SetHour(13);
	wk->WriteProgram();
	wk->SetHour(14);
	wk->WriteProgram();
	wk->SetHour(17);

	wk->SetTaskFinished(false);

	wk->WriteProgram();
	wk->SetHour(19);
	wk->WriteProgram();
	wk->SetHour(22);
	wk->WriteProgram();

	delete wk;
}


int main() {
    
    
	test1();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/wode_0828/article/details/114285314