【问题标题】:Is this a design pattern?这是一种设计模式吗?
【发布时间】:2009-04-14 16:25:37
【问题描述】:

在我们的整个代码库中,我们都有这种重复的模式,其中有一个接口与一个方法。这是真正的设计模式吗?如果是这样,它是什么,有什么好处?

这里有几个例子:

    public interface IRunnable
    {       
        void Run();     
    }

    public interface IAction
    {
        void Perform();
    }

    public interface ICommand
    {
        void Execute(ActionArgs _actionargs);
    }

【问题讨论】:

    标签: c# design-patterns oop


    【解决方案1】:

    我看到这被称为Command pattern。

    我第一次了解它是通过 Bob 叔叔的 Agile Principles, Patterns, and Practices in C#。

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

    每次我必须处理具有新布局的新文件类型时,我所要做的就是创建一个实现 Process 的新插件。

    这对我有用,因为我需要一个简单的解决方案。如果您需要接受多个参数,这可能不是要使用的模式。

    【讨论】:

      【解决方案2】:

      其中任何一个都可能是Command Pattern 的特定情况,具体取决于它的使用方式和上下文。这部分取决于您设置它的原因和方式。

      命令模式通常还包括状态和各种对象的概念。通常,这种类型的接口会暗示这一点,所以我猜这就是您在这里所认为的设计模式,但是如果没有调用者或多个目标,很难判断这是否是它的经典示例。 ..

      但是,这本身对我来说只是基本的接口抽象,而不是我归类为设计模式的东西。

      【讨论】:

        【解决方案3】:

        据说它是Command Design Pattern。但它(就我而言)更像是 Java 实现结果的方式。在 C# 中,您可以使用委托以及在 C++ 函数指针和函子中。

        如果您已经在某个 Class 方法中实现了一些反应,那么创建越来越多的类没有多大意义。您可以在 C++ 中绑定或在 C# 中设置为委托。在 Java 中,我想你别无选择,只能编写你找到的代码。

        【讨论】:

          【解决方案4】:

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

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

          可能是,正如之前的一些海报所建议的那样:http://en.wikipedia.org/wiki/Command_pattern

          【讨论】:

            【解决方案5】:

            您可以使用 lambda 表达式删除这种重复(或防止它用于以后的代码)。 Lambda 表达式正好适合这种情况。

            【讨论】:

              【解决方案6】:

              如果有的话,那就是函子。它用于没有第一类函数(指针)的语言中,用于函数(指针)的用途,例如线程的主函数。

              【讨论】:

                【解决方案7】:

                只有一种方法的接口应用程序。我的意思是,在 .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
                

                【讨论】:

                  【解决方案8】:

                  也许我遗漏了一些东西,但前两个看起来可能是strategy pattern 的一部分。基本上,一个对象有一个 IAction 类型的成员,并且该成员在运行时根据系统以特定方式(即使用特定策略)执行任务的需要进行分配/重新分配。

                  【讨论】:

                    猜你喜欢
                    • 2023-03-29
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2010-10-07
                    相关资源
                    最近更新 更多