如何使责任链模式适应通过状态

时间:2019-04-30 04:19:19

标签: c++ design-patterns

我正在寻找一种满足以下要求的设计:

  1. 有一个具有以下接口的公共可见对象:

    class Whatever
    {
        Whatever& GetIntstance();
    
        void UpdateData1(POD d1); // POD: Plain old datatype
        void UpdateData2(POD d2);
        // ...
        void UpdateDataN(POD dN);
    
        bool Question1();
        bool Question2();
        // ...
        bool QuestionM();
    }
    

void UpdateDataX(POD dX) (1 <= X <= N)设置内部状态的地方。

bool QuestionY() (1 <= Y <= M)的是/否问题是根据内部状态计算得出的。

  1. 无论实例是什么,可能都不知道如何回答所有问题。如果它不知道如何回答问题,则需要委派责任。
  2. 不同的问题可能会有不同的代表。
  3. 代表可能会有代表。
  4. 委托问题时,对象需要让委托人对其状态以及委托给它的任何东西的状态具有读取权限。
  5. 代表可能需要很长时间才能回答问题(不要问为什么),因此其答案可能会被缓存。这意味着,如果代理所依赖的状态发生变化,则需要通知该代理。这也意味着在调用UpdateDataX时需要通知代表。

假定委托的树结构(DAG结构或其他结构)在构造后是固定的。

1 个答案:

答案 0 :(得分:1)

解决此问题的典型方法是:

  1. 将可变状态提取到单独的模型对象中,该模型对象允许委托将更新侦听器附加到该对象(观察者模式)
  2. 在构造委托时(可能由Whatever进行构造),每个对象都会传递给模型对象,以及它依赖的其他任何委托(或其他任何东西)(构造函数依赖项注入)
  3. 如果委托人需要缓存,则它将自己实现/创建该缓存(单责任原则)。

由于您使用的是C ++,因此强调您应该使用RAII也很重要。由于对象之间存在所有生命周期关系,因此您可能会坚持使用shared_ptr进行模型和委托。