哪个设计模式适合这个场景C#

本文关键字:设计模式 | 更新日期: 2023-09-27 18:26:51

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

场景是:

我必须为一个实体执行一些步骤序列。类似:

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

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

如果管理员关闭了第2步,那么在第1步之后,我需要直接转到第3步。

有人能帮我确定上面提到的场景的设计模式吗。

感谢

哪个设计模式适合这个场景C#

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

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

使用工作流,您可以创建步骤1、步骤2、步骤3,因为工作流操作和步骤可以被禁用和重新启用等。

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

也许您可以尝试使用一些状态参数的模板方法模式。

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();
    }
}

但是,如果状态越来越多,您可以考虑将状态模式与此相结合。

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

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

您可以将"步骤"代码设计为模块,允许从"控制中心"打开和关闭标志,并根据需要采取的步骤引发事件。

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

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

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

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

对我来说,这听起来像是一种状态机类型的情况,步骤是您的状态对象,每个状态可能根据条件(例如当前打开的选项)有多个退出转换。然后,State将代替MVC中的C。

这里可以找到对该模式的讨论,重点是游戏编程以及其他可用的示例。

状态模式本质上允许您创建一个图形,更重要的是,允许图形的每条边都被指定行为。这将导致边被跟随。

所以在你的情况下,图表可以在我刚刚提出的这个虚构方案中定义为:

[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#中的委托来完成,在创建对象时将对象传递给每个状态,或者任何其他模式,使机器中的所有状态都可以访问此"全局"资源。

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