0

次のいずれかの状態になる可能性のあるRequestクラスがあります。

ドラフト、提出済み、承認済み、拒否済み、InMission、完了

Requestオブジェクトの状態は、次のいずれかのメソッドを呼び出すことで変更できます。各メソッドには、いくつかのデータを特定の状態にさらに関連付けるためのいくつかの引数が含まれる場合があります。

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

ここでStateパターンを実装することを考えていました。私の各州のクラスは、それらに関連する追加情報を保持します。ここでStateパターンを実装する私の主なアイデアは、次のように、これらの関連のないプロパティをすべてRequestクラス自体に追加しないことです。

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

Stateパターンはここで実装するのに適した候補だと思いますか?

よろしく、

モッシュ

4

2 に答える 2

0

Complete()状態パターンには、単にそのメソッドがないため、ドラフトで呼び出すことができないという利点があります。ただし、より複雑なクラス構造が必要なようです。

  • 提出済みは下書きです
  • 承認済みは提出済みです
  • 却下は提出済み
  • 完了は承認済みです

したがって、これらすべてがいくつかの Document インターフェイスを実装するよりも、深いツリーのようになります。

3 レベル以上のクラスをネストするのは面倒なので、これが必要かどうかよく考えてください。解決策は、2 つまたは 3 つの実数型のみを作成し、いくつかの状態をプロパティ フィールドに格納することです。ドラフトには、たとえば、プロパティ Rejected または Status があります。

別の方法は、Decorator パターンを使用することです。つまり、ドキュメントが承認された場合、新しい Approved を作成し、ドラフトをコンストラクターに渡します。この方法では、深い継承を取得せず、ドラフトから情報を取得できます。

于 2010-07-22T07:03:59.463 に答える
0

私が理解している限り、あなたの問題はクラス間でさまざまな情報を転送することですか?

これらすべての情報を構造体またはクラスにグループ化し、抽象 Request メソッドの引数として転送できます。したがって、各派生クラス (ドラフト、提出済み、承認済み) は、この構造体から必要な情報を取得したり、設定したりできます。次のようにこの情報を統合できます。

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

}

于 2010-07-22T09:11:43.867 に答える