在我们的代码库中,我们有这种重复的模式,其中有一个方法的接口。这是一个真正的设计模式吗?如果是这样,它会带来什么好处?
以下是一些例子:
public interface IRunnable
{
void Run();
}
public interface IAction
{
void Perform();
}
public interface ICommand
{
void Execute(ActionArgs _actionargs);
}
答案 0 :(得分:5)
我看到这被引用为Command pattern。
我第一次读到了读鲍勃叔叔的Agile Principles, Patterns, and Practices in C#。
我相信它的优雅是它的简约。我在编写文件处理服务时使用过它。该服务执行了读取/删除文件的所有管理。当需要处理文件时,它的各个插件被加载。每个插件都实现了Process
方法,并执行了处理该类型文件所需的任何操作。 (主要是解析内容并插入数据库。)
每次我必须使用新布局处理新文件类型时,我所要做的就是创建一个实现Process
的新插件。
这对我有用,因为我需要一个简单的解决方案。如果您需要接受多个参数,这可能不是使用的模式。
答案 1 :(得分:2)
其中任何一个都可能是Command Pattern的特定情况,具体取决于它的使用方式和背景。部分原因取决于你为什么以及如何设置它。
命令模式通常还包括状态和各种对象的概念。通常,这种类型的界面会暗示,所以我猜这是你在想这里作为一种设计模式,但没有调用者或多个目标,很难说这是否是一个经典的例子。 ..
然而,这本身就只是对我的基本界面抽象,而不是我将其归类为设计模式的东西。
答案 2 :(得分:2)
据说它是Command Design Pattern。但它(对我而言)更像是实现结果的Java方式。在C#中,您可以使用委托和C ++函数指针和函子。
如果你已经在一些Class方法中有一些反应的实现,那么创建越来越多的类没有什么意义。您可以在C ++中绑定哪个或在C#中设置为委托。在Java中,我想你别无选择,只能写下你找到的代码。
答案 3 :(得分:1)
我不确定您是否可以将其称为设计模式,因为您提供的接口不提供常见问题的解决方案,而是解决您正在开发的项目中的非常具体的问题。
您正确使用接口的原因是您不能让所有需要这些方法的类扩展包含这些的类,但您需要知道特定的类承诺实现这些。
可能正如之前的一些海报所暗示的那样:http://en.wikipedia.org/wiki/Command_pattern
答案 4 :(得分:1)
您可以使用lambda表达式删除此重复(或为将来的代码阻止它)。 Lambda表达式正是出于这种情况。
答案 5 :(得分:1)
如果有的话,那就是一个仿函数。它用于没有第一类函数(指针)的语言中,用于函数(指针)s的用途,例如线程的主函数。
答案 6 :(得分:1)
Interfaces的应用只有一种方法。我的意思是,在.NET中有很多--InotifyPropertyChanged,一个(PropertyChanged事件)。它只是保证一个对象有一个特定的方法(不管它实际上是什么类型的对象),所以你可以调用它(再次,无论类型如何)。
Dim runnableObjects As List(Of Object)
runnableObjects.Add(New MyRunnableObject1)
runnableObjects.Add(New MyRunnableObject2)
For Each o As IRunnable In runnableObjects
o.Run()
Next
答案 7 :(得分:0)
也许我错过了一些东西,但前两个看起来可能是strategy pattern的一部分。基本上,对象具有IAction类型的成员,并且该成员在运行时根据系统的需要以特定方式执行任务(即使用特定策略)进行分配/重新分配。