状态模式的基本概念
状态模式的核心思想是将一个对象的状态表示为一个类,然后根据对象的当前状态来改变它的行为。状态模式包含以下几个主要部分:
环境(Context):环境类维护一个对状态对象的引用,这个状态对象代表当前状态。环境类通常包含业务逻辑,这些逻辑会根据当前状态的不同而变化。环境中可以
抽象状态(State):这是一个抽象类或接口,定义了所有具体状态类共有的方法。
具体状态(Concrete States):这些类实现了抽象状态类定义的方法,并根据特定的状态来改变环境的行为。
除了任务名称和进度,环境类还可以包含更多的信息,例如:
**任务列表:**一个任务管理器可能需要管理多个任务,可以使用一个向量或列表来保存多个任务对象。
**优先级:**每个任务可以有不同的优先级,可以通过一个整数或枚举类型来表示。
**截止日期:**每个任务可以有截止日期,可以用 std::chrono::time_point 或其他日期时间类来表示。
任务描述:可以包含一个字符串来描述任务的具体内容。
以下示例代码包含了任务名称和进度。
示例代码
// StateModel.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
#include <iostream>
#include <vector>
#include <memory>
class TaskManager;
class TaskState
{
public:
virtual void handle(TaskManager& manager) const = 0;
};
// 环境类
class TaskManager
{
private:
TaskState* currentState;
std::string taskName;
int progress;
public:
TaskManager()
: currentState(nullptr), taskName(""), progress(0) {}
void setState(TaskState* state)
{
if (currentState != state)
{
delete currentState;
currentState = state;
}
}
TaskState* getState() const
{
return currentState;
}
void handle()
{
if (currentState)
{
currentState->handle(*this);
}
}
void setTaskName(const std::string& name)
{
taskName = name;
}
std::string getTaskName() const
{
return taskName;
}
int getProgress() const
{
return progress;
}
void incrementProgress()
{
progress++;
}
void resetProgress()
{
progress = 0;
}
};
// 抽象状态类
// 具体状态类 - 待办状态
class Todo : public TaskState
{
public:
void handle(TaskManager& manager) const override
{
std::cout << "Todo state: Task is not started yet." << std::endl;
}
};
// 具体状态类 - 进行中状态
class InProgress : public TaskState
{
public:
void handle(TaskManager& manager) const override
{
std::cout << "InProgress state: Task is being processed." << std::endl;
manager.incrementProgress();
std::cout<<"InProgress:"<<manager.getProgress()<<std::endl;
}
};
// 具体状态类 - 已完成状态
class Done : public TaskState
{
public:
void handle(TaskManager& manager) const override
{
std::cout << "Done state: Task is completed." << std::endl;
}
};
int main()
{
TaskManager manager;
// 设置任务名称
manager.setTaskName("Clean up the room");
// 设置待办状态并处理
manager.setState(new Todo());
manager.handle();
// 设置进行中状态并处理
manager.setState(new InProgress());
manager.handle();
// 处理多次以显示进度
for (int i = 0; i < 5; ++i)
{
manager.handle();
}
// 设置已完成状态并处理
manager.setState(new Done());
manager.handle();
// 输出任务名称和进度
std::cout << "Task Name: " << manager.getTaskName() << std::endl;
std::cout << "Progress: " << manager.getProgress() << std::endl;
return 0;
}