我想通过选择调用给定集合的方法来在运行时配置对象的行为。考虑这个简单的例子:
class Parameter;
class Conf;
class Obj {
public:
Obj( const Conf &t ): t_( t ) {}
void f( Parameter *d );
void f1( Parameter *d );
void f2( Parameter *d );
typedef void ( Obj::*Fn )( Parameter *d );
private:
const Conf &t_;
};
class Conf {
public:
Obj::Fn f;
};
void Obj::f( Parameter *d ) {
( this->*t_.f )( d );
}
通过更改给定Conf::f
对象的Conf
,更改了使用此对象配置的所有Obj
对象的行为。
第一个问题:这是否类似于某种设计模式(好吧,它是一种方法指针策略的东西......)?如果是这样,我应该考虑重新设计吗?
第二个问题:我想通过使用不同的参数类来使其更灵活。我已经通过使Parameter
成为基类并在fN
方法中进行类型转换来完成此操作,但这看起来不像是最终解决方案。有什么建议吗?
答案 0 :(得分:0)
这让我想起State pattern,考虑到状态发生变化时,将在不同的对象上调用方法。如果查看维基百科链接的Java示例,StateContext对象具有myState属性,该属性将更改为状态更改的其他State对象。
你可以做类似的事情,你的Obj类会有一个指向对象的指针/引用,该对象实现在它实现的接口中指定的方法。然后可以通过内部逻辑或通过外部设置将内部指针/引用更改为指向不同的对象,然后调用的方法将不同。
这是一个简短的例子:
class Action
{
virtual void action() = 0;
}
class Action1 : public Action
{
virtual void action() { /* do something useful here */ }
};
class Action2 : public Action
{
virtual void action() { /* do something different here */ }
}
class Obj
{
public:
setAction(Action *a) {a_ = a;}
void action() {if(a_) a_->action();}
private:
Action *a_;
};
{
Action1 a1;
Action2 a2;
Obj o;
o.setAction(&a1);
o.action();
o.setAction(&a2);
o.action();
}
正如评论中所提到的,这也与策略模式非常相似。