2010-07-22 25 views
0

J'ai un demande classe qui peut être dans l'un des états suivants:Est-il correct d'implémenter le modèle d'état ici?

Projet, Soumis, approuvé, Rejeté, InMission, Terminé

L'état de la Demande objet peut être modifié en appelant l'une des méthodes suivantes. Chaque méthode peut inclure des arguments à associer davantage certaines données à un état particulier:

void Submit(string by) { } 
void Approve(string by, string comment) { } 
void Reject(string by, string comment) { } 
void AddToMission(Mission mission) { } 
void Complete() { } 

Je pensais à mettre en œuvre l'État modèle ici. Chacune de mes classes d'état contiendra ces informations supplémentaires qui leur sont associées. Mon idée principale de mettre en œuvre État modèle ici est de ne pas ajouter toutes ces propriétés unreleated dans la demande classe elle-même, comme:

public string ApprovedBy; 
public string ApprovedComment; 
public string RejectedBy; 
public string RejectedComment; 
public Mission Mission; 

Pensez-vous que modèle Etat est un bon candidat pour mettre en œuvre ici?

Cordialement,

Mosh

Répondre

0

Le modèle d'état a l'avantage que vous ne pouvez pas appeler Complete() sur un projet, car il n'a tout simplement pas cette méthode. Cependant, il semble que vous souhaitiez une structure de classe plus complexe.

  • Soumis est un projet
  • réceptionner est un Submitted
  • Rejeté est un Submitted
  • Terminé est un Approuvée

Vous obtiendrez plus comme un arbre profond que tous ces mettre en œuvre une interface de document.

Pensez bien dans si vous voulez, parce que les classes de nidification plus de 3 niveaux est une douleur à travailler avec. Une solution pourrait être de ne faire que deux ou trois types réels, et de stocker certains états dans un champ de propriété. Le Projet aurait alors par exemple une propriété Rejetée ou Statut.

Une alternative consiste à utiliser le motif de décorateur. C'est-à-dire, si le document est approuvé, vous construisez un nouveau approuvé et passez le brouillon au constructeur. De cette façon, vous n'obtenez pas l'héritage profond et vous pouvez toujours obtenir des informations à partir du brouillon.

0

Pour autant que je compris votre problème est de transférer des informations entre les classes varient?

vous pouvez regrouper tous les informations dans une struct ou la classe et le transférer comme agrument de méthode abstraite de demande. afin que chaque classe dérivée (Brouillon, Soumis, Approuvé) puisse récupérer les informations nécessaires à partir de cette structure ou la définir. moveover vous pouvez unifier cette information comme ceci:

struct Info{ 
public string Status; // may be aproved reqested or so. 
public string Comment; // just a comment depending on state 
//public string RejectedBy; 
//public string RejectedComment; no need it 
public Mission Mission; //extra info 

}