【问题标题】:Strategy Pattern vs Dependency Injection策略模式与依赖注入
【发布时间】:2012-08-07 16:53:16
【问题描述】:

策略模式与依赖注入有何不同?

以下是您可以使用策略模式执行的操作:

class Foo{
   private readonly ISortAlgo _sortAlgo;

  public Foo(ISortAlgo sortAlgo)
  {
     _sortAlgo = sortAlgo;
  }

  public void Sort()
  {
    _sortAlgo.sort();
  }

}

使用 DI 你可以做同样的事情,基本上你可以有构造函数、设置器、接口等注入。它会产生与策略模式相同的效果。我知道 DI 还包含其他一些原则,例如松散耦合、可测试性、布线等。

在实施方面,我看不出有太大的不同。

策略模式和DI有什么区别?

【问题讨论】:

  • 目前的答案并不是特别令人满意。更好的答案会务实地关注在运行时注入变量行为的差异。

标签: c# design-patterns dependency-injection strategy-pattern


【解决方案1】:

首先,依赖注入不仅有构造函数注入作为注入方法,还有属性方法注入环境上下文

第二,stategy定义了behaviour,所以客户可以根据自己的需要选择特殊的一种。而依赖注入与外部依赖的抽象一起工作。

【讨论】:

  • +1 以获得很好的总结。我认为有些混淆是因为这两个 DP 使用相同的机制但具有不同的范围和意图。
【解决方案2】:

Strategy pattern 允许在运行时选择对象的行为(即其算法),而 Dependency injection 允许删除硬编码的依赖项。

因此他们不是竞争对手。它们的实现可能相似,但是它们的目标不同。

【讨论】:

  • "传递给一个方法,但这不会被认为是 DI"。更正:DI有多种形式。构造函数是最常见的形式(通常也是最好的选择),但方法注入也是依赖注入的一种形式。
  • 如果它被传递给一个方法只是为了执行一些操作(我想到的情况)而不是初始化一个类,你是否也认为它是 DI?
  • 依赖注入到方法中,所以是的,它是依赖注入的一种形式。然而,方法注入通常是一种非常脆弱的依赖注入方式,因为依赖必须是契约的一部分,并且在调用堆栈中将依赖从一个方法传递到另一个方法到另一个方法会很麻烦。
  • 与其说算法的行为,不如说对象的行为,不是吗?因为算法本身就是一种行为。
  • 是的,我改进了我的文字。
【解决方案3】:

策略允许你改变一个对象的行为。 DI 是一种允许您依赖抽象的设计模式。

【讨论】:

    【解决方案4】:

    依赖注入是一种模式,可以帮助您拆分构造表单逻辑,这对于测试和系统可扩展性非常有用。它也可以用于其他模式适合的地方,例如辛格尔顿。

    策略模式解决了一个不同的问题。它让运行时通过多态来选择算法 - 在 OOP 中。

    当然,他们可以一起工作。

    【讨论】:

      猜你喜欢
      • 2014-05-07
      • 1970-01-01
      • 2010-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-23
      • 2012-09-14
      相关资源
      最近更新 更多