C ++为一般设计问题找到最合适的设计模式

时间:2013-01-28 12:14:52

标签: c++

我非常疲惫,试图将实际问题与理论上的等价物联系起来/链接。

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

假设我有一个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);
};

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

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

是否有任何设计模式适用于此问题?

谢谢大家。

3 个答案:

答案 0 :(得分:3)

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

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

此外,在所有情况下都没有采用“神圣”的设计模式。没有适合模拟餐馆,汽车或其他任何设计模式的设计模式。您必须从模型中抽象这些细节,并找出您正在解决的问题的本质。

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

程序不是静态数据库:它们对您的数据进行某些事情,并且您的数据结构应该以最适合它们的方式设计,以便处理算法应该这样做。很少有像“普遍好”的设计这样的东西。如果有人告诉你他的话,请怀疑他。

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

换句话说,您的计划的运营要求是什么?执行上述查找的频率有多高?插入是否比查找更频繁?并且按照客户名称或表的ID查找比在整个表/服务员/客户中进行简单迭代以打印报告更频繁?

如果您没有明确适合的内容,则无法找到正确的设计。总而言之,你应该做两件事:

  1. 确定(或至少尝试合理假设)您的计划的运营要求;
  2. 通过抽象术语推理选择合适的设计模式,即删除特定于您的应用程序域的详细信息。

答案 1 :(得分:1)

正如我所见,您希望随时了解所有表的状态?

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

希望它有所帮助。

答案 2 :(得分:1)

coupla的想法。

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

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

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

  • 餐厅可以为工人提供公共功能“GetNextAvailableTable”。