2012-08-07 219 views
13

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

即低于是你可以用策略模式怎么做:

class Foo{ 
    private readonly ISortAlgo _sortAlgo; 

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

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

} 

与DI,你可以做同样的,基本上你可以有构造函数,setter方法,接口等注射。它会产生与战略模式相同的效果。我知道,DI也是一套其他原则,如松耦合,可测试性,布线等。

在实现方面我没有看到太大的区别。

战略模式和DI有什么不同?

+0

目前的答案并不是特别令人满意。更好的答案将注重实际上注重变量行为在运行时注入的差异。 – Mario 2014-08-19 15:09:12

回答

14

首先,依赖注入不仅具有构造器注入作为方法注入,也属性方法注射环境上下文

其次,stategy定义行为,所以客户可以选择在他的需求相匹配特殊的一个。而依赖注入与抽象的外部依赖关系。

+1

+1。提及*行为*。 – 2012-08-07 18:11:20

+1

对于一个不错的总结。我认为有些混淆是因为两个DP使用相同的机制,但有不同的范围和意图。 – 2012-08-08 06:51:01

12

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

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

+1

“传递给一个方法,但这不会被认为是DI”。更正:DI有多种形式。构造函数是最常见的形式(通常是最好的选择),但方法注入也是依赖注入的一种形式。 – Steven 2012-08-10 14:19:54

+0

如果将它传递给一个方法来执行一些操作(我想到的情况)而不是初始化一个类,那么您是否还会认为它是DI? – 2012-08-10 14:34:43

+0

将依赖注入到方法中,所以是的,它是依赖注入的一种形式。然而,注入方法通常是注入依赖关系的一种非常脆弱的方式,因为依赖关系必须是合同的一部分,并且将依赖关系从方法传递给方法,将方法传递给方法将会很麻烦。 – Steven 2012-08-10 15:57:55

6

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

4

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

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

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