首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重构帮助-策略模式

重构帮助-策略模式
EN

Stack Overflow用户
提问于 2009-07-21 15:56:37
回答 3查看 491关注 0票数 2

这里的对象是更新UI。我通常在客户端执行此操作,但此应用程序使用的是后台代码。无论如何,我的问题是,我正在尝试清理这些if else语句,我认为策略模式可能是合适的。我不需要为我做所有的事情,但如果你能给我几个指示来开始。我是不是先创建一个接口,然后每个策略再实现该接口?泛型在这里有帮助吗?接口中应该包含哪些类型的方法?任何能让我振作起来的事情都会非常感谢。

代码语言:javascript
复制
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

EN

回答 3

Stack Overflow用户

发布于 2009-07-21 16:03:01

首先,如果您要将策略模式与一个接口一起使用,您可能需要一个这样的接口。

代码语言:javascript
复制
public interface IStrategyUI
{
   void Execute();
}

然后是几个逻辑类

代码语言:javascript
复制
public class StatusAStrategy : IStrategyUI
{
  public void Execute()
   {
      //implement
   }
}

那么,从技术上讲,if语句可以是一个工厂。

代码语言:javascript
复制
IStrategyUI logic;

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

}

logic.Execute();

或者,您可以将此对象作为接口返回,并将switch语句封装在另一个方法或工厂类中。

这样你就可以像这样使用它。

代码语言:javascript
复制
IStrategyUI logic = StrategyFactory.GetStrategy(status);
logic.Execute();

由你决定。

另外,我在这里没有使用容器类,但是如果你愿意的话,你可以使用它。

您也可以对代理执行此操作。

包含类

代码语言:javascript
复制
 class StrategyHolder
    {
        public Action Strategy { get; set; }

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

不同的策略方法。

代码语言:javascript
复制
void EnableStatusA()
{
   //do everything for status A
}

Switch语句

代码语言:javascript
复制
StrategyHolder logic = new StrategyHolder();

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

    }

return logic;

从外部调用此功能。

代码语言:javascript
复制
StrategyHolder logic = StrategyFactory.GetStrategy(status);
logic.Execute();
票数 3
EN

Stack Overflow用户

发布于 2009-07-21 16:10:31

如果所有按钮都获得相同的启用,而不管状态如何,如您的示例所示,那么我会将其隐藏在一个按钮列表中,并对它们进行迭代。然后,您的策略参数可以归结为一个布尔值和一个字符串-而且无论如何都很容易做到这一点。如果它有更大的复杂性,那么实现设置控件的接口的不同类将是有序的,可能会有一个包含整体逻辑的抽象超类。

票数 3
EN

Stack Overflow用户

发布于 2009-07-21 16:46:47

我想你正在寻找的是State模式。这与策略模式类似,不同之处在于,在创建状态对象时,通常会为其提供对上下文对象(在本例中为表单)的引用。这允许不同的状态响应于事件对上下文对象做一些事情。

在实现状态模式时,通常更可取的是让每个独立的状态从抽象基类继承。然后,基类可以在虚方法中实现默认操作,然后您只需覆盖每个状态不同的操作。

代码语言:javascript
复制
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...
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1160132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档