2009-06-11 64 views
23

我想知道在实施策略设计模式时使用委托与OOP有什么优点/缺点?委托与OOP的C#策略设计模式

您推荐使用哪一个?或者委托人解决什么样的问题?如果OOP更好,我们为什么还要使用OOP?

谢谢!

-step

回答

36

这两种技术都可以是强大而有价值的 - 下面是关于何时使用哪些技术的一些看法。

使用一个接口/实施方法时的策略:

  • 维护状态
  • 需要配置
  • 使用依赖性注入需要
  • 由一个IoC被配置容器(想想ConnectionProvider)
  • 结合了多重责任(想想ADO的DataAdapter。NET)
  • 太复杂或只要还有一个方法
  • 很可能是子类来创建新的策略
  • 需要将状态信息返回给调用者
  • 需要访问的适用对象的内部
  • 需要太多直接的参数
  • 否则,倾向于使用基于Func键<>或行动<>的代表,特别是如果

    1. 有可能是一个非常大的各种策略(想排序表达式)
    2. 的战略是最好的表现为为lambda
    3. 有你想利用
    2

    我喜欢用一个接口来抽象我的策略。然后我的具体实现为每个策略都有一个可见文件。当使用类而不是方法时,它会给你更多的灵活性。我可以使用Rhino mock来模拟策略来测试它。我也可以很容易地使用Ninject等DI框架来很容易地绑定策略应用。我使用委托来提取主要在WinForm对话框中的实现。

    15

    在现有的方法代表们的青睐:

    • 使用lambda表达式和动态方法轻松实现代表轻松实现代表
    • 代表可以从“正常”的方法来创建与正确的签名
    • 代表是多投可以是多次使用(虽然相对较少之外三项赛)

    赞成的接口:

    • 一个对象可以实现一个接口,并且还做其他事情:一个代表是只是委托
    • 的interfac e可以有多种方法;委托只是有一个

    可能会有两种结果:

    • 随着你结束了两个人的名字接口:接口和方法。与代表你只有一个。我常常发现,单方法接口重复上述相同的名称两次(变化)或方法的名字很平淡

    我个人是代表们的灵活性的忠实粉丝,但它真的取决于情况。

    6

    在我看来,如果你使用代表,那么你实际上并没有实现Strategy pattern。你实际上正在实施更类似于Observer pattern的东西。设计模式的重点在于,当你说“我在这里使用了战略模式”时,每个人都对你所做的事情有很多背景。当你开始说“我已经使用了战略模式,除了我自己的个人修改”,那么事情就会变得渺茫。

    但是,如果我明白你在说什么,那么关于策略模式的好处之一就是代表不太清楚,你可以有一个实现策略的对象层次结构。

    假设我正在测试一些软件。我想用鼠标和键盘进行测试。因此,我将实施策略模式以插入用于每个测试用例的接口方法...因此,我可以编写一次测试用例,并使用MouseStrategy和KeyboardStrategy完全运行测试用例。从那里我可以实现专门化,如MouseExceptForDialogsStrategy,MouseStrategy的专业化。任何熟悉OOP概念的人都可以很容易地理解这种层次结构,如何扩展它并覆盖它,而如何实现和扩展与代表相同的结构则更为复杂和更加晦涩。

    与许多事情一样......它不是“你能做到吗?”的问题,而是“你应该做到吗?”。