我正在开发一个C#MVC应用程序。我想知道哪种设计模式最适合它。
场景是:
我必须为实体执行一系列步骤。像:
Step-1 Entity Created
Step-2 Entity Approved
Step-3 Entity Assigned to someone
Step-4 Entity Publish
..
....
这些步骤配置意味着在任何时间点管理员都可以打开/关闭一些非强制性步骤。像:
如果管理员关闭了步骤2,那么在步骤1之后,我需要直接在步骤3上移动。
任何人都可以帮我确定上述场景的设计模式。
由于
答案 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#中的委托来完成,将对象传递给其创建时的每个状态,或者任何其他模式将使计算机中的所有状态都访问此“全局”资源。
董事会的想法是状态可以向其发布数据,例如某些计算的结果或某些用户输入的值。然后,另一个运行状态可能会选择读取有用值的消息。