我一直在看一些代码,看到我的同事正在使用"标记类"来控制程序逻辑(参见下面的设计示例).它似乎工作得很好,代码读起来非常好,但有一些东西闻起来......
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)
什么是达到同样效果的更好方法?枚举?属性?
标记界面是一种更好的实践,因为它们提供了更大的灵活性.
但是在这种特定情况下,我认为虚拟调度是一种更好的解决方案.
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)
您想要做的是用策略模式替换它。策略定义了某事是如何完成的——即算法。
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 方法的代码。