`

【转】state模式与strategy模式的区别

 
阅读更多


在看重构一书,里面有这么一段:

 所以去网上查看一下区别。  

     原文链接:https://www.douban.com/note/202956377/?type=rec           mark~

     这几天在重温《Desigh Patterns: Elements of Reusable Object-Oriented Software》。其中state模式与strategy模式十分相似(最起码它们的类图——示意图是一样的),所以总结一下以加深记忆。
    State模式的目的是使对象在其内部状态发生改变时,对象的行为也相应发生变化。书中举的例子是关于TCP链接的。我们知道一个TCP链接的状态有:建立、监听、关闭等。当TCP链接处于不同状态时,其对一些操作(例如打开链接)的反应也是不同的,所以TCP链接自身需要一个State对象。


       如上图所示,State模式的参与角色有Context、State以及ConcreteState。Context是State模式的上下文,在TCP链接例子中就是TCP链接自身。它定义接口并向客户暴露,同时维护ConcreteState实例以标识自身状态。State是状态的抽象类或接口,它定义了一组具体状态都遵循的方法(例如TCP链接例子中的打开链接操作)。ConcreteState表示真实的、不同的状态,它继承或实现State定义的方法。假设一个TCP链接处于监听状态,则这个监听状态就由一个ConcreteState对象表示。

    Context、State与ConcreteState的协作关系如下:
    1. 当Context接收一个状态相关的操作时,它会将方法代理给表示当前状态的ConcreteState;
    2. 当State对象需要上下文数据时,Context可以将自身作为参数传递给State的方法;
    3. Context向客户暴露接口,而State不向客户暴露;客户在初始化Context时可以配置一个State对象,但之后客户就不能再直接操作State了;
    4. 只有Context与ConcreteState才可以决定在什么样的情况下,状态能变成什么样子。
    使用State模式可以很清晰地划分不同行为模式。因为ConcreteState的存在,使得新出现的状态更易添加。第二,使用State模式使得对象状态的变迁更加清晰。最后,如果State对象没有实例相关的内部属性,则不同Context之间可以共享State对象(使用Flyweight模式)。

    Strategy模式的目的是使一组相关的算法单独封装,并可相互替换。通过Strategy模式,算法的变更与进化可以独立于使用它们的客户。


    如上图所示,Strategy模式的参与角色有Strategy、ConcreteStrategy以及Context。Strategy声明了所支持的算法的公共接口。上下文(Context)通过调用这些公共接口来执行ConcreteStrategy实现的算法逻辑。ConcreteStrategy实现Strategy定义的算法接口。Context是上下文,它初始化时会配置一个ConcreteStrategy对象,并保持对这个ConcreteStrategy的引用。当然,Context也可以定义一个接口,使Strategy对象可以访问它自身的数据。

    Context、Strategy与ConcreteStrategy的协作关系如下:
    1. Strategy与Context进行交互,以实现算法的选择;当特定算法被调用时,Context可以传递其所需的数据过去;当然,Context也可以把自己作为参数传递过去(这可以实现Strategy对Context的回调);
    2. Context会直接传递客户的调用给Strategy对象;客户往往执行ConcreteStrategy对象的创建,以及对Context的配置;然后客户只与Context进行交互;客户经常会有一组ConcreteStrategy来选择。
    使用Strategy模式可以有效组织相关算法,并且使新算法的添加更加容易。另外一点,对于面向对象编程尤为重要的是,通过Strategy算法可以大大降低条件判断语句(if-else、switch等)出现的情况。第三,使用Strategy模式时,客户必须知道不同算法的存在

    最后总结一下:一言以蔽之,State模式下的多种状态对客户来说是透明的,而Strategy模式的不同算法通常对客户是不透明的。当对象的内部状态变迁,是由其自身决定的,而不是由客户决定的(或者客户并不知情),同时对象在不同状态下的行为也不一样时,则最好使用State模式;如果对象自身并不保存什么状态,而是由客户根据不同的情况去选择不同的算法,则最好使用Strategy模式。这样不同的算法对于客户来说都是可知的,并可以进行选择之后的这段E文来自网络,讲的也相当不错哦~ The state and strategy patterns are similar in the sense that both of them encapsulate behavior in separate objects and use composition to delegate to the composed object to implement the behavior and both of them provide the flexibility to change the behavior dynamically by changing the composed object at run-time. But there are some key differences : 1. In the state pattern, the client knows nothing about the state objects. State changes happen transparently to the client. The client just calls methods on the context, the context oversees its own state. Because the client is not aware of the state changes, it appears to the client as though the context is instantiated from a different class each time there is a change in behavior due to a state change. The object will appear to change its class as the official definition of the pattern states. The pattern is built around a well-defined series of state transitions. Changing state is key to the pattern's existence. 2. Even though the strategy pattern provides the flexibility to change behavior by changing the composed strategy object dynamically, mostly there is an appropriate strategy object already set for each context. ie even though the pattern provides a way to change the composed strategy object dynamically, there won't be much of a need for it. Even if it has to be done, it is the client that does the change. The client will call the setter method on the context and pass the new strategy object. Thus behavior changes are NOT transparent to the client and are initiated and controlled by the client. The pattern does not encourage a series of well-defined behavior changes like the state pattern. The client knows about the strategy objects and will usually set the appropriate strategy object in the context while creating it. The client controls what strategy object the context uses, but in the state pattern, the client knows nothing about the state object(s) that the context uses

    后记:2012年3月8日,部门开周会,大家又讨论了下两种模式的异同。现在补记如下:
    1. State模式的状态是可穷举的,一般数量不多,在Context初始化时就全部装载了,并在运行时产生变迁;Strategy模式的算法也是在Context初始化时装载的,但一般只装载一种算法,且在运行时不变话;
    2. State模式的ConcreteState有可能包含实例自身的状态信息,这种情况下State不能共享;如果State不包含实例自身的状态信息,则可以共享State(使用Flyweight模式);Strategy模式的ConcreteStrategy一般不包含实例自身的状态信息,可以共享;
    3. State模式与Strategy模式将不同的分支情况,放入不同的类。虽然会增加程序的类数量,但如果处理得当,则可以更加清晰地表明代码意图,使新分支情况的增加更加容易。

  • 大小: 38.7 KB
  • 大小: 34.5 KB
  • 大小: 57.2 KB
分享到:
评论

相关推荐

    Java设计模式 设计模式介绍

    2、爪哇语言抽象工厂创立性模式介绍 3、工厂方法创立性模式介绍 4、单态创立性模式介绍 5、单态创立性模式介绍 6、观察者模式介绍7、责任链模式 8、设计模式之Observer 9、设计模式之Strategy(策略) 10、设计模式之...

    JAVA设计模式chm文档

    创建模式: 设计模式之Factory 设计模式之Prototype(原型) 设计模式之Builder 设计模式之Singleton(单态) ...设计模式之Strategy(策略) 设计模式之Mediator(中介者) 设计模式之Interpreter(解释器) 设计模式之Visitor

    JAVA设计模式之行为模式

    这是JAVA设计模式中属于行为模式的部分,包括Template(模板模式)、Chain of Responsibility(责任链模式)、Memento(纪念品模式)、Mediator(中介模式)、Strategy(策略模式)、State 、Observer(观察者模式)、Visitor...

    24种设计模式以及混合设计模式

    如策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、命令模式(Command)、迭代器模式(Iterator)、访问者模式(Visitor)、备忘录模式(Memento)、状态模式(State)、职责链...

    软件设计模式与体系结构孙云山课后习题234章答案.zip

    - 策略模式(Strategy):定义一系列的算法,把它们一个个封装起来,并使它们可以相互替换。 - 模板方法模式(Template Method):在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。 这些设计模式的...

    C#设计模式_设计模式_C#_

    创建型: 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4.... 策略模式(Strategy Pattern) 22. 访问者模式(Visitor Pattern) 23. 状态模式(State Pattern)

    java设计模式教程+源代码

    AbstractFactory ( 抽象工厂 ) FactoryMethod ( 工厂方法 ) Singleton ( 单态模式 ) Builder ( 建造者模式 ) ...Strategy ( 策略模式 ) TemplateMethod ( 模板方法 ) Visitor ( 访问者模式 )

    C#版 24种设计模式

    备忘录模式(Memento Pattern) 策略模式(Strategy Pattern) 抽象工厂模式(Abstract Factory Pattern) 代理模式(Proxy Pattern) 单例模式(Singleton Pattern) 迭代器模式(Iterator Pattern) 访问者模式(Visitor ...

    23种java设计模式.pdf

    包括 Iterator(迭代模式)、Template(模板模式)、Chain of Responsibility(责任链模式)、Memento(纪念品模式)、Mediator(中介模式)、Interpreter(解释器模式)、Strategy(策略模式)、State(状态模式)...

    设计模式文档 chm

    设计模式参考文档 创建模式: 设计模式之Factory 设计模式之Prototype(原型) 设计模式之Builder ...设计模式之Strategy(策略) 设计模式之Mediator(中介者) 设计模式之Interpreter(解释器) 设计模式之Visitor

    C++设计模式(Design Pattern)范例源代码

    23种设计模式(Design Pattern)的C++实现范例,包括下面列出的各种模式,代码包含较详细注释。另外附上“设计模式迷你手册.chm” ...策略模式(Strategy) 模板方法模式(Template Method) 访问者模式(Visitor)

    设计模式那点事

    包括责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、备忘录模式(Memento)、观察者模式(Observer)、状态模式(State)、策略模式(Strategy...

    c#设计模式

    包括责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、...State)、策略模式(Strategy)、模板方法模式(Template Method)和访问者模式(Visitor)...

    C#面向对象设计模式纵横谈(视频与源码)

    C#面向对象设计模式纵横谈(1):面向对象设计模式与原则 C#面向对象设计模式纵横谈(2):Singleton 单件(创建型模式) C#面向对象设计模式纵横谈(3):Abstract Factory 抽象工厂模式(创建型模式) C#面向对象设计...

    设计模式与重构(design pattern )

    如策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、迭代器模式(Iterator)、命令模式(Command)、责任链模式(Chain of Responsibility)、备忘录模式(Memento)、状态模式...

    用Java实现23种设计模式

    策略模式(Strategy Pattern) 模板模式(Template Pattern) 访问者模式(Visitor Pattern) 4. J2EE 模式 MVC 模式(MVC Pattern) 业务代表模式(Business Delegate Pattern) 数据访问对象模式(Dao ...

    C++设计模式.pdf

    Strategy模式定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换,让算法的变化独立于使用算法的客户。 #### State模式 State模式允许一个对象在其内部状态改变时改变它的行为,对象看起来像是改变了...

    23种面向对象设计模式

    包括策略模式(Strategy)、模板方法模式(Template Method)、迭代器模式(Iterator)、观察者模式(Observer)、访问者模式(Visitor)、命令模式(Command)、备忘录模式(Memento)、状态模式(State)、解释器...

    C#经典设计模式及代码示例

    这本书结合了理论与实践,提供了丰富的代码示例,使得学习设计模式变得更加直观。 在C#编程中,设计模式的应用至关重要,因为它们可以帮助我们构建出结构良好、易于扩展和维护的系统。以下是几个主要的设计模式类别...

    Delphi模式编程第一分卷

    第24章 策略模式(Strategy) 24.1 模式解说 24.2 结构与用法 24.2.1 模式结构 24.2.2 代码模板 24.2.3 问题讨论 24.3 范例与实践 24.3.1 策略模式在酒店管理系统中的应用 24.3.2 范例小结 第25章 模板方法...

Global site tag (gtag.js) - Google Analytics