哪种设计模式适合这种情况C#?

时间:2015-12-15 03:27:53

标签: c# asp.net-mvc oop design-patterns

我正在开发一个C#MVC应用程序。我想知道哪种设计模式最适合它。

场景是:

我必须为实体执行一系列步骤。像:

Step-1 Entity Created
Step-2 Entity Approved
Step-3 Entity Assigned to someone
Step-4 Entity Publish
..
....

这些步骤配置意味着在任何时间点管理员都可以打开/关闭一些非强制性步骤。像:

如果管理员关闭了步骤2,那么在步骤1之后,我需要直接在步骤3上移动。

任何人都可以帮我确定上述场景的设计模式。

由于

6 个答案:

答案 0 :(得分:2)

在我看来,这是一个工作流程。 Microsoft有一个工作流引擎:https://code.msdn.microsoft.com/Windows-Workflow-deed2cd5

使用工作流程,您可以创建Step1,Step2,Step3,因为工作流程操作和步骤可以被禁用和重新启用等。

您还可以获得基于xaml的简洁工作流设计器。我发布的链接上有示例代码。

答案 1 :(得分:1)

我想到的第一个设计模式是State。您可以使每个州都有GetNextState()(或类似)方法,该方法执行必要的检查并返回相应的以下状态。

答案 2 :(得分:1)

也许你可以尝试Template Method Pattern一些状态参数。

abstract class AbsFoo {
    public abstract void Step1();
    public abstract void Step2();
    public abstract void Step3();
    public abstract void Step4();

    public void process(bool doStep1, 
                        bool doStep2,
                        bool doStep3,
                        bool doStep4) {
        if (doStep1) Step1();
        if (doStep2) Step2();
        if (doStep3) Step3();
        if (doStep4) Step4();
    }
}

class ConcreteFoo : AbsFoo {
    public override void Step1() {
        Console.WriteLine("Do something in step 1.");
    }
    public override void Step2()
    {
        Console.WriteLine("Do something in step 2.");
    }
    public override void Step3()
    {
        Console.WriteLine("Do something in step 3.");
    }
    public override void Step4()
    {
        Console.WriteLine("Do something in step 4.");
    }
}

然后在客户端类中,您可以在基类中调用该方法。

class Client {
    static void Main() {
        AbsFoo foo = new ConcreteFoo();

        foo.process(true, false, true, true);

        Console.ReadKey();
    }
}

但是,如果状态变得越来越多,您可以考虑将State Pattern与此结合使用。

答案 3 :(得分:0)

希望我能正确理解你的问题;

事件驱动的编程可能会让您感兴趣; https://msdn.microsoft.com/en-us/library/awbftdfh.aspx

您可以设计自己的步骤'作为模块的代码,允许从控制中心打开和关闭标志'并根据需要采取的步骤提出事件。

这也为多线程步骤留下了空间(如果您选择开发模块,并且可以保证它们是正交的)。

答案 4 :(得分:0)

我建议您在这种情况下使用template method设计模式。

确保执行顺序,提供关闭一个或多个步骤的功能。

参考:http://www.dofactory.com/net/template-method-design-pattern

答案 5 :(得分:0)

听起来像状态机类型的情况,其中步骤是您的状态对象,并且每个状态可能具有基于条件的多个退出转换(例如当前选项)。然后,国家将代表MVC中的C。

可以在with a focus on game programming找到有关模式的讨论,并提供其他示例。

状态模式基本上允许您创建图形,更重要的是,允许图形的每个边缘被分配行为,这将导致边缘被跟踪。

因此,在您的情况下,图表可以在我刚刚提出的这个组成方案中定义:

[state] => [transition-to] (condition)
1 => 3 (if opt_go_to_3 == true)
1 => 2 
2 => 3
2 => 5 (if some_other_optioon == true)
2 => 3
... (etc)

现在你的代码很好地客观化了,但仍然非常灵活。当涉及到你需要根据条件运行的行为时。

现在如果将这个状态对象用作MVC方案中的控制器,它实际上非常合适。

您的状态机的当前状态可以根据某些模型数据创建输入的新视图。

谈到这些模型数据,将其硬编码到状态机基础设施中并不是一个好主意,因为它使得一切都非常笨重。

而是考虑使用黑板或消息登机类型界面。这个想法说每个州都应该有一个接口来写一个消息给一个对象。

这可以使用C#中的委托来完成,将对象传递给其创建时的每个状态,或者任何其他模式将使计算机中的所有状态都访问此“全局”资源。

董事会的想法是状态可以向其发布数据,例如某些计算的结果或某些用户输入的值。然后,另一个运行状态可能会选择读取有用值的消息。