0

试图将实际问题与理论等价物联系/联系起来,我已经筋疲力尽了。

我将选择一个非常简单的例子来说明我的问题。

假设我有一个 Worker 类:

class Worker {
private : // default access modifier 
     int workerId;
};

假设我有一个 Table 类:

class Table {
private : // default access modifier 
    int tableId;
};

假设我有一个 ResturantManager 类:

class ResturantMangager
private: // default access modifier
    list<Table*> allTables;
    list<Worker*> allWorkers;
public:
    // the function should tell the worker that he should call one of its function,
    // its decision to what table to put the client returned by its function 
    // must be somehow updated in the allTables (mark the table he chose to put the client
    // as unavailable).
    void putClientInTable(const Worker& worker, const Client& client);
};

现在我想允许工作人员将一个客户端放在一个可用的表中,然后我希望餐厅的类数据成员 allTables 将此表(通过 ID 查找)标记为不可用。这意味着 Worker 应该能够决定选择哪个表(或者 ResturantManager 告诉他 - 我看不出如何以不同的方式实现它),然后必须更新 ResturantManager 的 allTables 。

我正在寻找最适合这个想法的设计模式( http://sourcemaking.com/design_patterns )。

有没有适合这个问题的设计模式?

谢谢你们。

4

3 回答 3

3

我只是不确定是否有适合这个想法的设计模式并且我可以使用它。它总是比再次发明轮子更好

一个非常令人愉快的方法。但是要正确回答您的问题,您应该问自己“什么想法?” . 存在解决一般问题的模式。您的问题涉及餐馆和工人,因此,您可能会发现选择特定模式很麻烦。

此外,没有在所有情况下都可以采用的“神圣”设计模式。没有适合建模餐厅、汽车或其他东西的设计模式。你必须从你的模型中抽象出这些细节,并弄清楚你正在解决的问题的本质是什么。

你想在你的班级之间建立什么样的关系?这些关联应如何导航?

程序不是静态数据库:它们对你的数据一些事情,你的数据结构应该以最适合它们的方式设计,以适合你的算法应该做的处理。很少有“普遍好”的设计这样的东西。如果有人在那里告诉你他的,请带着怀疑的态度听他的。

您的程序是否应该找出某个客户坐在哪张桌子上?它应该找出哪些顾客坐在哪张桌子上吗?是否应该找出哪些服务员在为哪个顾客或哪张桌子服务,或者每个服务员在一天中为同一张桌子服务了多少次?

换句话说,您的程序的操作要求是什么?执行上述查找的频率如何?插入是否比查找更频繁?通过客户姓名或表格 ID 进行查找,比仅在整组表格/服务员/客户上进行简单迭代以打印出报告的频率更高?

如果你不明确它应该适合什么,你就找不到合适的设计。所以总结一下,你应该做两件事:

  1. 确定(或至少尝试做出合理的假设)您的程序的操作要求;
  2. 通过抽象术语推理来选择适当的设计模式,即删除特定于您的应用程序领域的细节。
于 2013-01-28T12:37:02.803 回答
1

正如我所看到的,您想随时了解所有表格的状态吗?

一种设计理念是在您的父类或主类中维护全局数据集(在您的示例中,餐厅经理类中的 Table* allTables)。- 在您的工作人员类中编写函数,该函数将 Table* 的指针作为要处理的参数之一。- 使用指向主类中数据集的指针调用此函数。

希望能帮助到你。

于 2013-01-28T12:35:33.503 回答
1

一个情侣的想法。

  • 您的餐厅经理可能只是餐厅,因为它包含桌子。管理器不包含表。:-)

  • 工人和桌子应存放在容器中。STL 提供了很多。

  • 函数 PutClientInTable 可以是 Table 类的成员。这样,您可以通过“查看”表格来判断表格是否被占用(如果您将“GetIsOccupied()”添加到 Table 类中)。

  • 餐厅可以提供一个公共函数“GetNextAvailableTable”供工人调用。

于 2013-01-28T12:47:54.500 回答