Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/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_State Pattern - Fatal编程技术网

Oop 国家模式与战略模式的区别

Oop 国家模式与战略模式的区别,oop,design-patterns,strategy-pattern,state-pattern,Oop,Design Patterns,Strategy Pattern,State Pattern,看看GoF模式,我发现国家和国家模式之间的相似性相当惊人。 两者都交换出多态类来修改行为。还有人发现了同样的吗 具体的区别是什么?战略模式决定如何执行某些行动,而状态模式决定何时执行这些行动 通过使用状态模式,状态持有(上下文)类不再需要了解它是什么状态或类型以及可用的状态或类型。这意味着该类遵循开放-关闭设计原则(OCP):该类对于存在的状态/类型的更改是关闭的,但状态/类型对扩展是开放的 通过使用策略模式,使用(上下文)类的算法不再需要了解如何执行特定任务(“算法”)。这种情况也造成了对OC

看看GoF模式,我发现国家和国家模式之间的相似性相当惊人。 两者都交换出多态类来修改行为。还有人发现了同样的吗


具体的区别是什么?

战略模式决定如何执行某些行动,而状态模式决定何时执行这些行动

通过使用状态模式,状态持有(上下文)类不再需要了解它是什么状态或类型以及可用的状态或类型。这意味着该类遵循开放-关闭设计原则(OCP):该类对于存在的状态/类型的更改是关闭的,但状态/类型对扩展是开放的


通过使用策略模式,使用(上下文)类的算法不再需要了解如何执行特定任务(“算法”)。这种情况也造成了对OCP的遵守;该类已关闭,以更改如何执行此任务,但是设计非常开放,可以添加其他算法来解决此任务

状态和策略模式在某种意义上是相似的,它们都将行为封装在单独的对象中,并使用组合来委托给组合对象来实现行为,并且它们都提供了更改行为的灵活性通过在运行时更改组合对象来动态执行行为。但有一些关键区别:

  • 在状态模式中,客户机对状态对象一无所知。状态更改对客户端是透明的。客户端只调用上下文上的方法,上下文监督自己的状态。由于客户机不知道状态更改,因此在客户机看来,每次由于状态更改而导致行为更改时,上下文都是从不同的类实例化的。当模式的正式定义声明时,该对象似乎会更改其类。该模式是围绕一系列定义良好的状态转换构建的。改变状态是模式存在的关键


  • 即使策略模式通过动态更改组合的策略对象提供了更改行为的灵活性,但大多数情况下,已经为每个上下文设置了适当的策略对象。即使模式提供了一种动态更改组合策略对象的方法,也不需要太多。即使必须这样做,也是由客户机进行更改。客户机将在上下文上调用setter方法并传递新策略对象。因此,行为更改对客户端是不透明的,由客户端发起和控制。该模式不鼓励一系列定义良好的行为更改,如状态模式。客户机知道策略对象,通常在创建时会在上下文中设置适当的策略对象。客户端控制上下文使用的策略对象,但在状态模式中,客户端对上下文使用的状态对象一无所知

    有关更多信息,请参考以下链接


  • 重复“因此,行为更改对‘客户机’不透明,由客户机发起和控制。”我猜这不是‘客户机’,而是‘上下文’。@AnutomaschHandy这在上下文中是相同的。