私が見る限り、 StatePolicyとBehaviorPolicyの 2 つのポリシーを受け入れるDeviceというクラスがあります。
StatePolicyは、デバイスの状態を保持および管理します。BehaviorPolicy
は、C または C++ で記述されたデバイス ドライバーをラップします。
今、私は2つの質問があります:
- 状態と行動ポリシーをどのように調整するか?
- すべてのデバイスを 1 つのコンテナー内に保管するにはどうすればよいですか? Device<X, Y> のタイプは Device<N, M> とは異なるため、1 つのコンテナーに格納することはできません。
編集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: これにより、コードは 1 つの欠点で機能します。許可されているすべての状態タイプのリストを維持する必要があります。私にはビジターのパターンに少し似ています。何かご意見は?
class AbstractDevice
{
public:
virtual ~AbstractDevice() {}
virtual void performAction() = 0;
virtual const string &getName() const = 0;
virtual void changeState(const int &_state) = 0;
};
前もってありがとう、
オマー。