这是一个设计模式吗?

5
我们的代码库中存在一个重复的模式,其中有一个只有一个方法的接口。这是一种真正的设计模式吗?如果是,它是什么以及其好处是什么?
以下是一些例子:
    public interface IRunnable
    {       
        void Run();     
    }

    public interface IAction
    {
        void Perform();
    }

    public interface ICommand
    {
        void Execute(ActionArgs _actionargs);
    }
8个回答

5

我看到这被称为命令模式

我第一次了解它是在阅读 Uncle Bob 的 C#敏捷原则、模式与实践 时。

我认为它的优雅在于它的简单性。当我编写文件处理服务时,我使用了它。该服务执行所有读取/删除文件的管理工作。当需要处理文件时,它的相应插件被加载。每个插件都实现了一个Process方法,并执行处理该类型文件所需的任何操作。 (主要是解析内容并插入数据库。)

每当我需要使用新的布局处理新的文件类型时,我只需要创建一个实现Process的新插件即可。

这对我很有效,因为我需要一个简单的解决方案。如果您需要输入多个参数,则可能不适合使用此模式。


2
这些都很有可能是命令模式的具体应用案例,这取决于使用方式和上下文。其中一部分取决于你设置它的原因和方式。
命令模式通常也包括状态和各种对象的概念。通常这种类型的接口会建议这样做,所以我猜这就是你在这里考虑的设计模式,但如果没有调用者或多个目标,很难确定这是否是经典示例...
然而,就我个人而言,这本身只是基本的接口抽象化,并不是我会归类为设计模式的东西。

2

正如所说,这是一个命令设计模式。但(对我来说)更像是Java实现结果的方式。 在C#中,您可以使用委托,在C ++中使用函数指针和仿函数。

如果您已经在某个类方法中有一些反应的实现,则没有必要创建更多的类。您可以在C ++中绑定它,或在C#中设置委托。在Java中,我想您别无选择,只能编写找到的代码。


1

我不确定你是否可以将其称为设计模式,因为你提供的接口并没有提供常见问题的解决方案,而是针对你正在开发的项目中非常特定的问题提供了解决方案。

你正确使用接口的原因是因为你不能让所有需要这些方法的类都扩展包含这些方法的基类,但你需要知道特定的类承诺实现这些方法。

可能会像一些之前的帖子建议的那样:http://en.wikipedia.org/wiki/Command_pattern


1

您可以使用Lambda表达式来消除这种重复(或者在未来的代码中防止它)。Lambda表达式正是为了处理这种情况而设计的。


1

如果必须说的话,那就是一个函数对象。它在没有第一类函数(指针)的语言中用于函数(指针)用于的那种事情,例如一个线程的主要函数。


1

有些接口只有一个方法。我的意思是,在.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

0
也许我漏掉了什么,但前两个看起来像是策略模式的一部分。基本上,一个对象有一个类型为IAction的成员,该成员在运行时根据系统需要被分配/重新分配,以特定方式执行任务(即使用特定策略)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接