模式避免循环调用

时间:2016-12-01 05:42:25

标签: c++11 design-patterns

我有以下Policy类:

interface IPolicy
{
public:
virtual void func1() = 0;
}

class CPolicy : public IPolicy
{
public:
void func1() override { // do something }
}

我有实用工具类

class Util {
public:
void func1() {
if( policy != nullptr ) policy->func1(); // customized behavior

// default behavior
}

}

现在问题是,考虑策略实现有一些条件,如果该条件失败,策略调用默认实现(这是场景之一,可以有多种组合)

class CPolicy : public IPolicy
{
public:
void func1() override { 
 if( condition ) 
 {
    // customized logic
 }
 pDefaultUtil->func1();
}
}

现在,如果您看到此实现,它将以循环调用结束。

为了解决这个问题,我在IPolicy合同中介绍了另一个功能。

interface IPolicy
{
public:
virtual void func1() = 0;
virtual bool ShouldUsePolicy() = 0;
}


class CPolicy : public IPolicy
{
public:
void func1() override { 
 if( condition ) 
 {
    // customized logic
 }
 usePolicy = false;
 pDefaultUtil->func1();
usePolicy = true;
// other logic continues.
}

bool ShouldUsePolicy() override { return usePolicy; }
private:
bool usePolicy { true };
}

和Util类被修改为:

class Util {
public:
void func1() {
if( policy != nullptr && policy->ShouldUsePolicy() ) policy->func1(); // customized behavior

// default behavior
}

}

通过这些更改,一切都会按预期工作,但我对这种设计不满意。我不想依赖Policy是否正确设置usePolicy变量。如果任何调用来自策略到默认实现,那么我应该能够忽略策略。

这些问题有没有好的模式/解决方案?

1 个答案:

答案 0 :(得分:0)

Policy课程不应该做任何比它负责的更多的事情(单一责任原则)。一个简单的改变是让func1返回一个bool值,让Utility类决定当它返回false时要做什么。

class IPolicy
{
public:
  virtual bool func1() = 0;
  virtual ~IPolicy() {};
}


class CPolicy : public IPolicy
{
public:
  void func1() override { 
    if( condition ) 
    {
      // customized logic
      return true;
    }
    return false;
};

class Util {
public:
  void func1() {
    assert (policy);
    if (! policy->func1()) {
      // Call the default action as seen
      // fit by the Util class
    }
  }
};