1

さまざまなデザインパターンをマスターするための継続的な探求の中で、私は「状態」デザインパターンに遭遇しました。

まず、このパターンをどこで使おうとしているのかを説明しましょう。状態を適用したいフォームがあります。私のプログラムには、Configuration、Processing、ProcessingCompleteの3つの状態があります。フォームの状態が変わると、フォームのさまざまなコンポーネントが有効/無効、表示/非表示などになります。

Stateパターンを理解すると、これらすべての変更(コンポーネントの表示/非表示、有効化/無効化など)は、フォームのインスタンスを含む別のクラス内で発生するはずです。さまざまなStateクラスがフォームのクラスから分離されている場合、Stateクラスはフォームのコンポーネントにアクセスできません。これにより、次の2つのオプションのいずれかが可能になると思います。

  1. フォームのコンポーネントを公開する
  2. Stateクラスをフォームの内部クラスにします

オプション(1)は悪い形だと思いますが、オプション(2)はどういうわけかStateパターンの精神に違反していると思います。私が持っていたもう1つの考えは、オプション(2)を使用することでしたが、部分的なクラス実装を使用しましたが、それでもStateパターンの精神に違反していると感じています。

どちらかの選択に対する私の気持ちは不当ですか、それとも私が考えもしなかった別の選択肢がありますか?

4

3 に答える 3

1

部分的な実装は避けます。通常、付加価値を与えず、コードを読みにくくします。部分的なクラスが良いアイデアであると私が考えることができる唯一の場所は、コードの一部が自動生成されるときです(WinFormsデザイナーのように)。

MVPやある種のバインディングを使用するのはどうですか?コントロールのVisibleプロパティとEnabledプロパティをModelクラスにバインドすると、フォームのインスタンスを保持する代わりに、そのModelのインスタンスを保持できます。

于 2011-01-04T18:15:59.003 に答える
1

オプション2を選択します。「State」は「Form」にのみ使用されるため、意味的に固有であるため、クラス階層でそれを作成してみませんか?

于 2011-01-04T18:21:47.030 に答える
1

3番目のオプションがありません。

クラスの契約の一部として州が管理する部分を含めます。

したがって、ラベルのテキストを変更することが目標である場合は、基本のStateクラスにラベルを送信する必要があります。次に、適切なフィールドを設定するInitializeState(State myState)orBuildStates()メソッドをフォームに含めることができます。

オプション1は間違っています。オプション2は、与えられたものだけを実行できるように状態を設計するときに実際には不要になります。これは、オブジェクトがとにかく動作する方法です。

于 2011-01-04T18:35:53.797 に答える