【问题标题】:Best way of implementing Strategy Pattern实施策略模式的最佳方式
【发布时间】:2013-06-11 15:13:43
【问题描述】:

我一直在寻找Strategy Pattern,我看到了This 链接,该人已经很好地解释了这种模式。

但据我所知(可能对或错),您不应该在另一个 class 中创建新的 class(为了松散耦合)。

this.motor = new Motor(this)

有没有更好的实现方式来不违反原则(如 IoC)?

【问题讨论】:

  • 您通常按照定义的方式实现设计模式。据我所知,除了任何语言的语法外,它们看起来都一样。

标签: c# design-patterns strategy-pattern


【解决方案1】:

它将生成更易于维护的代码来将您的策略​​和上下文定义为接口:

interface IStrategy<T> where T : IContext
{
    T Context { get; }

    void Execute();
}

// this cab have other structures too depending on your common logic
// like being generic
interface IContext
{
}

我自己更喜欢构造函数注入。但在这种情况下,需要进行属性注入,因为可能需要在运行时更改策略。

现在您可以实现/注入您的具体类型。

【讨论】:

  • 策略模式用于改变运行时的行为。如果我使用必须在组合根中注入具体类的构造注入,如何在运行时更改它?我说的对吗?
  • 你说得对,根据我对这种模式的经验,我已经提到“但在这种情况下,属性注入使代码更清晰”。但感谢你记得我为什么这一切都是真的!
  • 谢谢@MehrdadKamelzadeh;我已经修改了帖子。
【解决方案2】:

您可以使用构造函数注入。

public class MyClass{

public MyClass(Motor motor){
       this.motor = motor;
   }

}

然后,由您的 IOC 容器来提供所需的依赖项。

【讨论】:

  • 策略模式用于改变运行时的行为。如果我使用必须在组合根中注入具体类的构造注入,如何在运行时更改它?我说的对吗?
  • 构造函数仍然在运行时执行,你仍然在运行时注入依赖。 MyClass 不知道它在构建时会收到什么类型的 Motor,它并不关心。
【解决方案3】:

当然,有很多可能性。战略工厂呢?

this.motor = MotorFactory.newMotor(MotorFactory.BOOST);

或者只是一个用于注入的 mutator 方法(假设 IMotor 是电机的抽象接口:)

void setMotor(IMotor m) {
    this.motor = m;
}

【讨论】:

  • 你能告诉我MotorFactory长什么样吗?我的意思是它的实施如何?你介意我让你在这里写 MotorFactory 类吗?
【解决方案4】:

你可以像这样在 c# 中使用“动态”:

方法(动态输入)

方法(DTO1 输入) 方法(DTO2 输入) 方法(DTO3 输入)

【讨论】:

    猜你喜欢
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    • 2012-05-22
    相关资源
    最近更新 更多