使用标记类来控制逻辑流程

Kev*_*inT 6 .net c#

我一直在看一些代码,看到我的同事正在使用"标记类"来控制程序逻辑(参见下面的设计示例).它似乎工作得很好,代码读起来非常好,但有一些东西闻起来......

namespace ConsoleApplication4983
{
    public class MyClass
    {
        static void Main()
        {
            var c = new MyClass();
            c.DoSomething(new Sequential());
            c.DoSomething(new Random());
        }

        public void DoSomething(ProcessingMethod method)
        {
            if (method is Sequential)
            {
                // do something sequential
            }
            else if (method is Random)
            {
                // do something random
            }
        }
    }

    public class ProcessingMethod {}
    public class Sequential : ProcessingMethod {}
    public class Random : ProcessingMethod {}
}
Run Code Online (Sandbox Code Playgroud)

什么是达到同样效果的更好方法?枚举?属性?

And*_*are 8

标记界面是一种更好的实践,因为它们提供了更大的灵活性.

但是在这种特定情况下,我认为虚拟调度是一种更好的解决方案.

using System;

namespace ConsoleApplication4983
{
    public class MyClass
    {
        static void Main()
        {
            var c = new MyClass();
            c.DoSomething(new Sequential());
            c.DoSomething(new Random());
        }

        public void DoSomething(ProcessingMethod method)
        {
            method.Foo();
        }
    }

    public class ProcessingMethod
    {
        public virtual void Foo() { }
    }
    public class Sequential : ProcessingMethod
    {
        public override void Foo() { }
    }
    public class Random : ProcessingMethod
    {
        public override void Foo() { }
    }
}
Run Code Online (Sandbox Code Playgroud)


tva*_*son 5

您想要做的是用策略模式替换它。策略定义了某事是如何完成的——即算法。

public interface IProcessingMethod
{
    void Process();
}

public class SequentialProcess : IProcessingMethod
{
    public void Process( IProcessable obj )
    {
         do something sequentially with the obj
    }
}

public class ParallelProcess : IProcessingMethod
{
    public void Process( IProcessable obj )
    {
        do something in parallel with the obj
    }
}

public interface IProcessable
{
    void Process( IProcessingMethod method );
}

public class MyClass : IProcessable
{
     public void Process( IProcessingMethod method )
     {
         method.Process( this );
     }
}

...

var obj = new MyClass();
obj.Process( new SequentialProcess() );
Run Code Online (Sandbox Code Playgroud)

现在,如果我有一种新的 ProcessingMethod 类型,我只需要为该方法创建类并更改确定将哪种处理方法注入到我的 IProcessable 对象的 Process 方法的代码。