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

    状态模式当一个对象的内在状态改变时同意改变其行为,这个对象看起来像是改变了其类。
    状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的推断逻辑转移到表示不同状态的一系列类其中,能够把复杂的推断逻辑简化。
    适用场景:
    1. 一个对象的行为取决于他的状态,而且它必须在执行时刻依据状态改变他的行为。

    2. 一个操作中含有庞大的多分支结构,而且这些分支决定于对象的状态。


    代码实例结构图:




    代码:
    //Status.h
    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    
    class Work;
    class State
    {
    public:
    	virtual ~State(){}
    	virtual void WritePrograme(Work* work) = 0;
    };
    
    class Work
    {
    private:
    	State* Current;
    	double Hour;
    	bool finish = false;
    public:
    	~Work()
    	{
    		if (Current != NULL)
    			delete Current;
    	}
    	double GetHour(){ return Hour; }
    	void SetHour(double hour){ Hour = hour; }
    
    	bool TaskFinished(){ return finish; }
    	void SetFinish(bool f){ finish = f; }
    
    	void SetState(State* s){ Current = s; }
    
    	void WritePrograme()
    	{
    		Current->WritePrograme(this);
    	}
    };
    
    class  SleepingState :public State
    {
    public:
    	virtual void WritePrograme(Work* work)
    	{
    			cout << "睡觉时间" << endl;
    	}
    };
    
    class  AfternoonState :public State
    {
    public:
    	virtual void WritePrograme(Work* work)
    	{
    		if (work->GetHour() < 18)
    		{
    			cout << "下午时间" << endl;
    		}
    		else
    		{
    			work->SetState(new SleepingState());
    			work->WritePrograme();
    		}
    	}
    };
    
    class  ForenoonState :public State
    {
    public:
    	virtual void WritePrograme(Work* work)
    	{
    		if (work->GetHour() < 12)
    		{
    			cout << "上午时间" << endl;
    		}
    		else
    		{
    			work->SetState(new AfternoonState());
    			work->WritePrograme();
    		}
    	}
    };
    
    // StatusPattern.cpp
    // StatusPattern.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include "Status.h"
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	Work* work = new Work();
    	work->SetState(new ForenoonState());
    	work->SetHour(10);
    	work->WritePrograme();
    
    	work->SetHour(20);
    	work->WritePrograme();
    
    	getchar();
    	return 0;
    }
    



  • 相关阅读:
    圣洁之美BY Janosch Simon
    多线程的概念讲解
    纯CSS做背景渐变
    如何用css3的boxshadow属性来为盒子增加阴影
    下载的chm文件打不开?
    大学教程:客户关系管理(CRM)复习资料
    细说CSS的transform
    浏览网页常用快捷键
    EDM邮件营销
    黑白世界,感受不同的旅行...
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5182672.html
Copyright © 2011-2022 走看看