我有以下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变量。如果任何调用来自策略到默认实现,那么我应该能够忽略策略。
这些问题有没有好的模式/解决方案?
答案 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
}
}
};