以下是一些例子:
public interface IRunnable
{
void Run();
}
public interface IAction
{
void Perform();
}
public interface ICommand
{
void Execute(ActionArgs _actionargs);
}
public interface IRunnable
{
void Run();
}
public interface IAction
{
void Perform();
}
public interface ICommand
{
void Execute(ActionArgs _actionargs);
}
我看到这被称为命令模式。
我第一次了解它是在阅读 Uncle Bob 的 C#敏捷原则、模式与实践 时。
我认为它的优雅在于它的简单性。当我编写文件处理服务时,我使用了它。该服务执行所有读取/删除文件的管理工作。当需要处理文件时,它的相应插件被加载。每个插件都实现了一个Process
方法,并执行处理该类型文件所需的任何操作。 (主要是解析内容并插入数据库。)
每当我需要使用新的布局处理新的文件类型时,我只需要创建一个实现Process
的新插件即可。
这对我很有效,因为我需要一个简单的解决方案。如果您需要输入多个参数,则可能不适合使用此模式。
正如所说,这是一个命令设计模式。但(对我来说)更像是Java实现结果的方式。 在C#中,您可以使用委托,在C ++中使用函数指针和仿函数。
如果您已经在某个类方法中有一些反应的实现,则没有必要创建更多的类。您可以在C ++中绑定它,或在C#中设置委托。在Java中,我想您别无选择,只能编写找到的代码。
我不确定你是否可以将其称为设计模式,因为你提供的接口并没有提供常见问题的解决方案,而是针对你正在开发的项目中非常特定的问题提供了解决方案。
你正确使用接口的原因是因为你不能让所有需要这些方法的类都扩展包含这些方法的基类,但你需要知道特定的类承诺实现这些方法。
可能会像一些之前的帖子建议的那样:http://en.wikipedia.org/wiki/Command_pattern
您可以使用Lambda表达式来消除这种重复(或者在未来的代码中防止它)。Lambda表达式正是为了处理这种情况而设计的。
如果必须说的话,那就是一个函数对象。它在没有第一类函数(指针)的语言中用于函数(指针)用于的那种事情,例如一个线程的主要函数。
有些接口只有一个方法。我的意思是,在.NET中有很多 - 例如INotifyPropertyChanged(属性更改事件)。它只是保证对象具有某个方法(无论实际上是什么类型的对象),因此您可以调用它(同样,无论类型如何)。
Dim runnableObjects As List(Of Object)
runnableObjects.Add(New MyRunnableObject1)
runnableObjects.Add(New MyRunnableObject2)
For Each o As IRunnable In runnableObjects
o.Run()
Next