我有一个类(让我们称之为检查器)和不同类型的类来执行任务(让我们称之为任务)。每个任务都属于几个类别。
每个任务都会运行,并在某个时候询问检查人员是否允许他们做一些事情。检查器根据系统状态和它们的类别回答。任务可以分为多个类别。
你将如何实现这一点?(cpp,但我并不认为它的语言是特定的)。
我在考虑在每个任务中添加一个类别列表,并有一个函数,如果任务属于它,就会得到一个类别和答案。
class checker {
bool is_allowed(Task * task);
}
class Task
{
bool is_belongging_to_category(Category cat);
void some_task_to_do()
{
...
if (checker::is_allowed(this)) { ....}
else {....}
}
}有更好的办法解决这个问题吗?也许是一些已知的设计模式..。
发布于 2017-01-04 15:59:18
这看起来像是可疑的设计。你把任务变成了目标。
假设你的任务是:吃,喝,和Be_Merry
如果您创建了每个任务对象,它们将必须维护对它们所操作的实际个体的引用,然后当满足条件时,它们将需要修改给定个体的状态。
这违反了面向对象设计,后者将对象定义为:
数据结构与作用于数据的方法或函数的紧密耦合或关联
注意,您已经将“作用于数据的方法或函数”与对象分开。相反,您应该对对象Jack和Jill进行建模,这些对象具有方法:Eat、have和BeMerry
就checker而言,是否将其打包将取决于您使用的是推还是拉码。如果您正在进行推送编码,那么检查器只是Jack和Jill行为属性的一个保持区域,在这种情况下,属性应该被推送到Jack和Jill,而不是保存在checker中。如果它们是所有Jack或Jill对象的属性,请使用static属性。但是,如果使用的是拉编码,则在尝试执行任务之前,这些信息是不可用的。在这种情况下,checker可能是Jack和Jill在执行任务过程中访问的唯一对象。
编辑:
你的评论进一步揭示了设计中的悲剧。似乎您已经启动了一堆正在忙着等待checker的线程。这表明您需要使用拉编码。您是Jack和Jill对象,需要维护它们积极参与的任务,例如m_is_going_to_school,然后当checker获得停止您在设计中等待的条件时,而开始使用goToSchool方法。
发布于 2017-01-04 15:38:10
您可以创建一个向量来存储所有可能允许的选项。您可以使用参数字符串创建一个名为IsAllowed的bool函数(就像您已经做的那样),这将检查它将要执行的选项是否被允许。如果没有,则返回false。不过这只是我的主意。当然,有无数种不同的方法来实现这一点。如果你想要多个选择。然后,您可以创建一个2d向量,并查看相应的行是否有任何选项。祝好运!
发布于 2017-01-04 15:46:19
如果您事先知道类别的最大数量,我建议使用位标志来实现这一点。
enum Category {
CATEGORY_A = 1,
CATEGORY_B = 1 << 1,
CATEGORY_C = 1 << 2,
CATEGORY_D = 1 << 3,
};
class Task {
int32_t categories_;
public:
Task() : categories_(0) {}
void add_category(Category cat) {
categories_ |= cat;
}
void run() {
checker::can_run(categories_);
}
} 这允许同时测试多个类别:
namespace checker {
bool can_run(int32_t categories) {
int32_t cannot_run_right_now = CATEGORY_A | CATEGORY_C;
if(categories & cannot_run_right_now != 0) {
return false;
}
...
}
}https://stackoverflow.com/questions/41467518
复制相似问题