Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 战略模式是否违反了单一责任原则?_Oop_Design Patterns_Strategy Pattern - Fatal编程技术网

Oop 战略模式是否违反了单一责任原则?

Oop 战略模式是否违反了单一责任原则?,oop,design-patterns,strategy-pattern,Oop,Design Patterns,Strategy Pattern,如果单一责任原则规定每个对象都必须有一个更改的原因,并且使用策略模式(根据定义)实现的单个策略类有多个方法可以因任意数量的原因更改,这是否意味着在不违反SRP的情况下实施战略模式是不可能的?好的一点:)我想这更像是一个单一的责任准则,对许多情况来说都是有意义的,但对一些情况来说也没有意义,比如战略模式。如何? 回想起来,策略模式基本上是一种将所使用的逻辑/算法解耦的方法。所以客户有m_i算法。IAlgorithm应该有一小部分方法(如果没有的话) 因此,一个AlgoImplementation类

如果单一责任原则规定每个对象都必须有一个更改的原因,并且使用策略模式(根据定义)实现的单个策略类有多个方法可以因任意数量的原因更改,这是否意味着在不违反SRP的情况下实施战略模式是不可能的?

好的一点:)我想这更像是一个单一的责任准则,对许多情况来说都是有意义的,但对一些情况来说也没有意义,比如战略模式。

如何? 回想起来,策略模式基本上是一种将所使用的逻辑/算法解耦的方法。所以客户有m_i算法。IAlgorithm应该有一小部分方法(如果没有的话)

因此,一个AlgoImplementation类可以更改的唯一原因是

  • 如果它实现的算法有变化。(其责任/行为的变化
  • 或者如果IAlgoritm发生变化。。除非在定义接口时出错,否则这种情况很少见。(这是对其自身公共界面的一种改变——所以不要认为这违反了SRP。)

    • 我实际上看到了相反的情况。策略模式允许您将两件事解耦,用于完成某些工作的(潜在)算法和关于这些算法的决策逻辑


      我不确定你是否有一个类,它既有使用哪种算法的条件逻辑,也包含了这些算法。此外,我并不是说你暗示了这一点,但你没有给出一个例子,说明战略会打破SRP,你认为什么是更好的设计。

      我最熟悉的单一责任原则的背景是在整个系统设计中,并且可以在系统内的组件分组方面补充策略模式

      使用strategy模式定义一组客户端可交换使用的算法,然后可以使用single responsibility原则来决定将客户端和客户端在系统中使用的算法分组到哪里。如果您的工作仅在算法B中进行,那么您不想干扰算法A的代码,反之亦然。对于编译语言,这可能会对重因子、版本和部署周期的复杂性产生重大影响。当只需要更改算法B的位置时,为什么要对客户端和算法A、C和D进行版本和重新编译


      基于对单一责任原则的理解,我不认为拥有一个实现策略模式的类会违反SRP。客户机类的目的是实现策略模式,即客户机责任。这些算法的目的是实现它们负责的逻辑,单一责任原则说,不要在系统中将它们全部分组,因为它们会因不同的原因而改变。这是我的$0.02。

      我不太明白你所说的“使用strategy模式(根据定义)实现的单个strategy类有多个方法,可以因多种原因而更改”。你在想什么定义?我在想战略模式的经典GOF定义,它是一个单一的策略类,包含一组逻辑相关的方法