【发布时间】:2009-08-23 13:11:38
【问题描述】:
我有一个名为 Device 的类,据我所知,它接受两个策略:StatePolicy 和 BehaviorPolicy。
StatePolicy 保存和管理设备的状态。
BehaviorPolicy 封装了用 C 或 C++ 编写的设备驱动程序。
现在我有两个问题:
- 如何协调状态和行为政策?
- 如何将所有设备存储在一个容器中?由于 Device
的类型与 Device 不同,因此我无法将它们存储在一个容器中。
编辑 1: 下面是一些代码来说明我的问题:
class AbstractDevice
{
public:
virtual ~AbstractDevice() {}
virtual void performAction() = 0;
virtual const string &getName() const = 0;
//virtual void changeState(const ??? &_state) = 0; If I put a template here it won't solve my problem
};
template<typename T>
class State
{
private:
T state;
protected:
typedef T StateType;
public:
State() : state(1) {}
const T &getState() { return state; }
void setState(const T _state) { state = _state; }
};
template <class StatePolicy>
class LightbulbBehvior : protected StatePolicy
{
private:
typedef StatePolicy SP;
public:
virtual void performAction()
{
if ( SP::getState() )
cout << "do stuff";
}
void changeState(const typename SP::StateType &_state)
{
setState(_state);
performAction();
}
};
template<class StatePolicy, template <class> class BehviorPolicy>
class Device : public AbstractDevice, public BehviorPolicy<StatePolicy>
{
private:
string sName;
public:
const string &getName() const { return sName; }
};
int main()
{
AbstractDevice *d = new Device<State<int>, LightbulbBehvior>();
d->changeState(5);
return 0;
}
编辑 2: 这使得代码有一个缺点,我必须维护所有允许的状态类型的列表。在我看来,它有点像访客模式。 有什么想法吗?
class AbstractDevice
{
public:
virtual ~AbstractDevice() {}
virtual void performAction() = 0;
virtual const string &getName() const = 0;
virtual void changeState(const int &_state) = 0;
};
提前致谢,
奥马尔。
【问题讨论】:
-
我不认为这是基于策略的设计。我认为这只是一个具有多种授权或策略组合的设计决策。但设计是如何表示策略。它不是基于某些政策的设计。
-
我认为这是一个很好的例子,说明人们很容易误解策略和一般模式的概念。
-
我添加了一些代码来阐明我的意思。
标签: c++ templates policy-based-design