2

ここでの目的は、UIを更新することです。私は通常クライアントでこれを行いますが、このアプリケーションはコードビハインドを使用します。とにかく私の質問は、elseステートメントの場合はこれらをクリーンアップしようとしていることであり、戦略パターンが適切である可能性があると思いました。私は私のためにすべてを行う必要はありませんが、あなたが私に始めるためのいくつかの指針を与えることができれば。最初にインターフェースを作成してから、各戦略でインターフェースを実装しますか?ジェネリックはここで役に立ちますか?インターフェイスにはどのような種類のメソッドを含める必要がありますか?私を動かすために何かがあれば非常にありがたいです。

if (someObject.Status == 'A') {
                    btnRecordCall.Enabled = false;
                    btnAddMailOrStatusAction.Enabled = false;
                    btnPayments.Enabled = false;
                    btnAddressMaint.Enabled = false;
                    btnFilter.Enabled = false;
                    btnAddCoverage.Enabled = false;
                    btnPolicyForms.Enabled = false;
                    lblIsArchived.Text = "********** THIS CLAIM HAS BEEN ARCHIVED **********";
                } else if (someObject.Status == 'D') {
                    btnRecordCall.Enabled = false;
                    btnAddMailOrStatusAction.Enabled = false;
                    btnPayments.Enabled = false;
                    btnAddressMaint.Enabled = false;
                    btnFilter.Enabled = false;
                    btnAddCoverage.Enabled = false;
                    btnPolicyForms.Enabled = false;
                    lblIsArchived.Text = "- De-archive Request Pending";
                } else {
                    btnRecordCall.Enabled = true;
                    btnAddMailOrStatusAction.Enabled = true;
                    btnPayments.Enabled = true;
                    btnAddressMaint.Enabled = true;
                    btnFilter.Enabled = true;
                    btnAddCoverage.Enabled = true;
                    btnPolicyForms.Enabled = true;
                    lblIsArchived.Text = "";
                }

ありがとう、〜ck

4

3 に答える 3

3

あなたの例のように、ステータスに関係なくすべてのボタンが同じ有効になっている場合は、ボタンのリストにそれを隠して、それらを繰り返すだけです。次に、戦略のパラメーターは単一のブール値と文字列に要約されます-とにかくそれを行うのは非常に簡単です. より複雑な場合は、コントロールを設定するインターフェイスを実装するさまざまなクラスが適切であり、おそらく全体的なロジックを保持する抽象スーパークラスを使用します。

于 2009-07-21T16:10:30.763 に答える
3

まず第一に、インターフェイスで戦略パターンを使用する場合は、このようなインターフェイスが必要になる場合があります。

public interface IStrategyUI
{
   void Execute();
}

次に、ロジック用のいくつかのクラス

public class StatusAStrategy : IStrategyUI
{
  public void Execute()
   {
      //implement
   }
}

あなたのif文は技術的に工場になることができます。

IStrategyUI logic;

switch(someObject.Status)
{
    case 'A':   logic = new StatusAStrategy();
            //etc etc

}

logic.Execute();

または、このオブジェクトをインターフェイスとして返し、switch ステートメントを別のメソッドまたはファクトリ クラスにカプセル化することもできます。

こんな風に使っていただけるように。

IStrategyUI logic = StrategyFactory.GetStrategy(status);
logic.Execute();

それはあなた次第です。

また、ここでは包含クラスを使用していませんが、必要に応じて使用できます。

デリゲートでもこれを行うことができます。

収容クラス

 class StrategyHolder
    {
        public Action Strategy { get; set; }

        public void Execute()
        {
            if(this.Strategy != null)
                 this.Strategy();
        }
    }

さまざまな戦略方法。

void EnableStatusA()
{
   //do everything for status A
}

Switch ステートメント

StrategyHolder logic = new StrategyHolder();

switch(someObject.Status)
    {
        case 'A':   logic.Strategy = EnableStatusA;
                //etc etc

    }

return logic;

これを外部から呼び出します。

StrategyHolder logic = StrategyFactory.GetStrategy(status);
logic.Execute();
于 2009-07-21T16:03:01.340 に答える
0

あなたが探しているのはのパッテンだと思います。これは、各状態オブジェクトが通常、作成時にコンテキスト オブジェクト (この場合はフォーム) への参照が与えられることを除いて、戦略パターンに似ています。これにより、さまざまな状態がイベントに応じてコンテキスト オブジェクトに対して何かを行うことができます。

状態パターンを実装する場合、多くの場合、個別の状態を抽象基底クラスから継承させることが望ましいです。次に、基本クラスは仮想メソッドでデフォルトの操作を実装できるため、状態ごとに異なる操作をオーバーライドするだけで済みます。

public interface IFormState
{
    void EnableDisableControls();
}

public class DefaultState : IFormState
{
    private MyForm context;

    public DefaultState(MyForm context)
    {
        this.context = context;
    }

    protected MyForm Context
    {
        get
        {
            return this.context;
        }
    }

    public virtual void EnableDisableControls()
    {
        this.context.btnRecordCall.Enabled = true;
        this.context.btnAddMailOrStatusAction.Enabled = true;
        this.context.btnPayments.Enabled = true;
        this.context.btnAddressMaint.Enabled = true;
        this.context.btnFilter.Enabled = true;
        this.context.btnAddCoverage.Enabled = true;
        this.context.btnPolicyForms.Enabled = true;
        this.context.lblIsArchived.Text = "";
    }
}

public class StateA : DefaultState
{
    public StateA(MyForm context)
        : base(context)
    {
    }

    public override void EnableDisableControls()
    {
        base.EnableDisableControls();

        this.Context.lblIsArchived.Text = "********** THIS CLAIM HAS BEEN ARCHIVED **********";
        // etc...
    }
}
于 2009-07-21T16:46:46.960 に答える