Ich habe eine Klasse Geräte genannt, die bis zwei Richtlinien akzeptiert wie ich sehen kann: StatePolicy und BehaviorPolicy.
Die StatePolicy hält und verwaltet den Zustand des Geräts.
Die BehaviorPolicy umschließt den Gerätetreiber, der in C oder C++ geschrieben wird.
Jetzt habe ich zwei Fragen:Politik basierte Design-Entscheidungen
- Wie zwischen dem Staat und den Verhaltensrichtlinien koordinieren?
- Wie speichere ich alle Geräte in einem Container? Da Gerät < X, Y > 's Typ ist anders als Gerät < N, M > Ich kann sie nicht mit einem Container speichern.
EDIT 1: Hier einige Code ist mein Problem zu veranschaulichen:
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;
}
EDIT 2: Dies macht den Code mit einem Nachteil funktioniert, ich habe eine Liste aller erlaubten Statustypen zu erhalten. Es sieht ein bisschen wie das Besuchermuster für mich aus. Irgendwelche Gedanken?
class AbstractDevice
{
public:
virtual ~AbstractDevice() {}
virtual void performAction() = 0;
virtual const string &getName() const = 0;
virtual void changeState(const int &_state) = 0;
};
Vielen Dank im Voraus,
Omer.
Ich glaube nicht, dass dies ein Politik * basiertes * Design ist. Ich denke, es ist nur eine Designentscheidung mit mehreren Kombinationen von Delegation oder Strategie. Aber das Design besteht darin, * Richtlinien * darzustellen. Es ist kein Design * basierend auf einer bestimmten Richtlinie. –
Ich denke, dies ist ein gutes Beispiel dafür, wie leicht es ist, die Idee von Politiken und Mustern im Allgemeinen zu missverstehen. –
Ich habe einen Code hinzugefügt, um zu verdeutlichen, was ich meine. –