实现的功能
模拟一个任务系统,有两个任务,完成条件不相同,使用策略模式写了两个任务的完成情况。
另外,用到了单例模式和shared_ptr
代码
//Strategy.h
#pragma once
#include "Singleton.h"
#include <unordered_map>
#include <memory>
using namespace std;
namespace Strategy
{
class TaskBase
{
public:
TaskBase(){}
~TaskBase(){}
virtual bool FinishCheck(int parameter1, int parameter2) = 0;
protected:
int _task_type;
int _parameter1;
int _parameter2;
};
class TaskFirst : public TaskBase
{
public:
TaskFirst(){}
~TaskFirst(){}
virtual bool FinishCheck(int parameter1, int parameter2)
{
if (parameter1 < _parameter1 || parameter2 < _parameter2) return false;
return true;
}
};
class TaskSecond : public TaskBase
{
public:
TaskSecond(){};
~TaskSecond(){};
virtual bool FinishCheck(int parameter1, int parameter2)
{
if (parameter1 < _parameter1 || parameter2 < _parameter2) return false;
if (parameter1 * parameter2 < 100) return false;
return true;
}
};
class TaskManager : public Singleton<TaskManager>
{
public:
TaskManager()
{
_init();
}
~TaskManager(){};
//在玩家任务参数变化的时候调用,如杀了一只怪
bool Record(int taskId, int parameter1, int parameter2)
{
shared_ptr<TaskBase> task_ptr = _getTaskPtr(taskId);
if (task_ptr == nullptr)
return false;
return task_ptr->FinishCheck(parameter1, parameter2);
}
private:
bool _init()
{
//不能这样初始化:
//_TaskMap.insert(make_pair(1, make_shared<TaskFirst>()));
//应该是因为将make_shared出来的指针传给insert函数的过程中
//引用计数减了1,然后变成了空,insert拿到的就是一个空
shared_ptr<TaskFirst> ptr1 = make_shared<TaskFirst>();
_TaskMap.insert(make_pair(1, ptr1));
shared_ptr<TaskSecond> ptr2 = make_shared<TaskSecond>();
_TaskMap.insert(make_pair(2, shared_ptr<TaskSecond>()));
return true;
}
shared_ptr<TaskBase> _getTaskPtr(int taskId)
{
auto itFind = _TaskMap.find(taskId);
if (itFind != _TaskMap.end())
return itFind->second;
return nullptr;
}
private:
unordered_map<int, shared_ptr<TaskBase>> _TaskMap;
};
//玩家自己的任务记录
class TaskRecord
{
public:
void SetTaskRecord(int taskId, bool res)
{
recordMap[taskId] = res;
}
private:
unordered_map<int, bool> recordMap;
};
}
//main.cpp
//Singleton.h在上面
#include "Singleton.h"
#include "Strategy.h"
using namespace Strategy;
int main(int argc, char* argv[])
{
TaskRecord record;
record.SetTaskRecord(1, TaskManager::GetSinglePtr()->Record(1, 100, 100));
record.SetTaskRecord(2, TaskManager::GetSinglePtr()->Record(2, 100, 100));
return 0;
}