当前位置: 首页 > 知识库问答 >
问题:

虚拟具体战略的战略模式

滕璞瑜
2023-03-14
  1. 为每个任务实例化具体策略,并在task不是plannable时实现“虚拟”策略(如下所示)。代码中到处都有奇怪的可为空的startfinish变量,在本例中...
  2. 在不计划任务的情况下具有nullableIPlanningStrategy变量,并且只有当任务“提升”为plannable时才使用具体策略实例化。

备选方案(1)应该是这样的:

public class Task
{
    public string Title { get; set; }

    private IPlanningStrategy planningStrategy;

    public Task()
    {
        planningStrategy = new NoPlanStrategy();
    }

    public Task(IPlanningStrategy initialPlanningStrategy)
    {
        planningStrategy = initialPlanningStrategy;
    }

    public void SetPlanningStrategy(IPlanningStrategy newPlanningStrategy)
    {
        planningStrategy = newPlanningStrategy;
    }

    public DateTime? Start { get { return planningStrategy.Start; } }
    public DateTime? Finish { get { return planningStrategy.Finish; } }
}


public interface IPlanningStrategy
{
    public void CalculatePlan();
    public DateTime? Start { get; }
    public DateTime? Finish { get; }
}

// "Dummy" strategy, used when Task does not have Planning behaviour
//
public class NoPlanStrategy : IPlanningStrategy
{
    public void CalculatePlan() { }
    public DateTime? Start { get { return null; } }
    public DateTime? Finish { get { return null; } }
}



public class PlanStrategyA : IPlanningStrategy
{
    private int parameter1;
    private int parameter2;
    private DateTime? start;
    private DateTime? finish;

    public PlanStrategyA(int p1, int p2)
    {
        parameter1 = p1;
        parameter2 = p2;
        start = finish = null;
    }

    public void CalculatePlan()
    {
        // ... uses parameter1 & parameter2
        // ... to calculate start and finish
    }

    public DateTime? Start { get { return start; } }

    public DateTime? Finish { get { return finish; } }
}

public class PlanStrategyB : IPlanningStrategy
{
    public int parameter3;

    // ... the rest is similar to PlanningStrategyA

}

现在我看到了不同的**非常重要的**问题。除了algorithm(当然实现该算法的所有任务都共享)之外,我的每个具体策略类还包含附加参数,这些参数只属于特定的task

您可以将parameter1想象为export(或者,例如,完成任务所需的剩余小时数),将parameter2想象为lastdate(表示约束日期,即完成任务的最后允许日期)。这个参数自然属于特定的task,但前提是它实现了这个特定的strategya

task类外实例化策略似乎没有意义?或者这应该是某个factory方法的作业?

共有1个答案

国晟睿
2023-03-14

IMO您在task类中公开了太多信息。我会这样做:

public class Task
{
    // what is title being used for?
    public string Title { get; set; }

    private IPlanningStrategy planningStrategy;

    public Task(IPlanningStrategy initialPlanningStrategy)
    {
        // Initialize it outside of constructor
        if(initialPlanningStrategy == null)
        {  
           throw new NullArgumentException(); // or return. 
        }
        planningStrategy = initialPlanningStrategy;
    }

    public void CalculatePlan(){
        // check null and return.
        planningStrategy.CalculatePlan();
    }

}

你的客户不应该知道开始,结束,我不认为这是一个算法容器的责任。

此外,如果你的NoPlanStrategy什么都不做,为什么要引入它。移除它。

 类似资料:
  • 问题内容: 假设我使用Spring,我有以下策略… 接口 首要策略 下一个策略… 上下文… 现在说这个上下文是通过mvc控制器访问的,例如… 上下文应该是一个组成部分吗?当我这样做时,出现一条错误消息说loadOnStartup,正如您所期望的,该策略可能是一个nonUniqueBean。是否所有的bean都需要像上面一样的组件,或者我的注释不正确? 我最大的疑问确实是您可以在Spring MVC

  • 在策略模式中,可以在运行时更改类行为或其算法。 这种类型的设计模式属于行为模式。 在策略模式中,我们创建表示各种策略的对象和根据其策略对象行为不同的上下文对象。 策略对象更改上下文对象的执行算法。 实现 (Implementation) 我们将创建一个Strategy接口,用于定义实现Strategy接口的操作和具体策略类。 Context是一个使用策略的类。 StrategyPatternDem

  • Here are my current thoughts on the gradual migration to .NET development tools at Fog Creek. 下面就是我关于FogCreek公司慢慢转移到.NET开发工具的想法。 The status quo: Most of CityDesk is written in Visual Basic 6.0, with p

  • 这是我的路线: 我正在尝试将一个交换发送到两个以上不同的HTTPendpoint。 这是我的聚合策略: 但是 body 始终等于 “”,inMsg 为 “[body 是 java.io.InputStream 的实例]” convertBodyTo(String.class)也不起作用(至少是我使用它的方式)。 我到底做错了什么? PS。路由上的streamCaching()或上下文上的setSt

  • 问题内容: 我一直在阅读有关OCP主体以及如何使用策略模式来实现此目的的信息。 我打算尝试向几个人解释这一点,但是我能想到的唯一示例是根据“订单”的状态使用不同的验证类。 我已经在线阅读了几篇文章,但这些文章通常不会描述使用该策略的真实原因,例如生成报告/账单/验证等。 您是否认为现实世界中有常见的战略模式示例? 问题答案: 你必须加密文件。 对于小文件,可以使用“内存中”策略,其中读取完整的文件

  • 我正在研究一个推荐系统。这将是一个Android应用程序,用户将输入他们的偏好,并在这些偏好的基础上,其他匹配的配置文件将显示给该用户。我正在从用户那里获取数据,并将其存储在Firebase中。 这些是数值,为了向用户显示匹配的配置文件,我使用两种算法来计算用户之间的相似性计数:和 由于这将是一个实时应用程序,所以这种方法是完全错误的,我想实现策略设计模式,其中算法可以在运行时决定,而不是在编译时