2

这里的对象是更新 UI。我通常在客户端上执行此操作,但是此应用程序使用后面的代码。无论如何,我的问题是我正在尝试清理这些 if 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
}

切换语句

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 回答