`

状态模式和策略模式的比较

阅读更多
状态模式和策略模式的比较


状态模式(state pattern)和策略模式(strategy pattern) 的实现方法非常类似,都是利用多态把一些操作分配到一组相关的简单的类中,因此很多人认为这两种模式实际上是相同的。

然而在现实世界中,策略(如促销一种商品的策略)和状态(如同一个按钮来控制一个电梯的状态,又如手机界面中一个按钮来控制手机)是两种完全不同的思想。当我们对状态和策略进行建模时,这种差异会导致完全不同的问题。例如,对状态进行建模时,状态迁移是一个核心内容;然而,在选择策略时,迁移与此毫无关系。另外,策略模式允许一个客户选择或提供一种策略,而这种思想在状态模式中完全没有。

一个策略是一个计划或方案,通过执行这个计划或方案,我们可以在给定的输入条件下达到一个特定的目标。策略是一组方案,他们可以相互替换;选择一个策略,获得策略的输出。策略模式用于随不同外部环境采取不同行为的场合。我们可以参考微软企业库底层Object Builder的创建对象的strategy实现方式。

而状态模式不同,对一个状态特别重要的对象,通过状态机来建模一个对象的状态;状态模式处理的核心问题是状态的迁移,因为在对象存在很多状态情况下,对各个business flow,各个状态之间跳转和迁移过程都是及其复杂的。例如一个工作流,审批一个文件,存在新建、提交、已修改、HR部门审批中、老板审批中、HR审批失败、老板审批失败等状态,涉及多个角色交互,涉及很多事件,这种情况下用状态模式(状态机)来建模更加合适;把各个状态和相应的实现步骤封装成一组简单的继承自一个接口或抽象类的类,通过另外的一个Context来操作他们之间的自动状态变换,通过event来自动实现各个状态之间的跳转。在整个生命周期中存在一个状态的迁移曲线,这个迁移曲线对客户是透明的。我们可以参考微软最新的WWF 状态机工作流实现思想。

在状态模式中,状态的变迁是由对象的内部条件决定,外界只需关心其接口,不必关心其状态对象的创建和转化;而策略模式里,采取何种策略由外部条件(C)决定。
分享到:
评论

相关推荐

    55-Java设计模式之策略模式与状态模式1

    策略模式和状态模式都是 Java 设计模式中的重要组成部分,它们可以帮助我们解决复杂的问题,使得代码更加灵活和可维护。在实际工作中,了解和应用这些设计模式对于提高开发效率和代码质量是非常重要的。

    23种设计模式之:建造者,代理,观察,策略,状态模式

    本文将重点介绍标题中提到的五种设计模式:建造者模式、代理模式、观察者模式、策略模式以及状态模式。 **1. 建造者模式(Builder)** 建造者模式是一种创建型设计模式,它允许我们分步骤构建复杂对象,而无需暴露...

    观察者模式和策略模式举例

    观察者模式和策略模式是软件设计模式中的两种重要概念,它们在解决特定问题时能提供高效、灵活的解决方案。设计模式是一种在特定情况下解决问题的通用、可重用的解决方案,是经验丰富的软件开发者们智慧的结晶。 ...

    对比Java设计模式编程中的状态模式和策略模式

    状态模式和策略模式都是设计模式中的重要成员,它们在Java编程中被广泛使用,以解决特定的软件设计问题。这两种模式都属于行为模式,因为它们关注的是对象如何响应某些行为。 首先,状态模式的主要思想是封装对象...

    设计模式-状态模式分享ppt

    虽然状态模式和策略模式在结构上有一定的相似性,但它们的目的和应用场景有所不同: - **状态模式**:关注的是对象内部状态的变化,状态的改变会导致行为的变化,且状态之间的转换通常是隐式的。 - **策略模式**:...

    Java开发之策略模式责任链模式状态模式观察者模式合并扣减库存demo.zip

    Java开发之策略模式责任链模式状态模式观察者模式合并扣减库存demo Java开发之策略模式责任链模式状态模式观察者模式合并扣减库存demo Java开发之策略模式责任链模式状态模式观察者模式合并扣减库存demo

    PHP设计模式实例之(观察者模式、策略模式、简单工厂模式)借鉴.pdf

    策略模式的主要参与者有Strategy(算法接口)和Context(上下文)。在 PHP 中,可以使用抽象类和接口来实现策略模式。 在给定的代码中,Strategy 抽象类定义了 AlgorithmInterface 方法,用于声明算法接口。...

    策略模式工厂方法模式观察者模式

    通过阅读这些学习资料,你将能更好地理解如何在实际项目中运用策略模式、工厂方法模式和观察者模式,提升自己的编程技能和设计能力。记住,设计模式是为了解决问题,而不是为了模式本身,所以理解其背后的意图和应用...

    设计模式之单件模式、工厂模式、策略模式、观察者模式(php描述)(资料整理)

    本文将深入探讨四种常见的设计模式:单件模式(Singleton)、工厂模式(Factory)、策略模式(Strategy)和观察者模式(Observer),并以PHP语言为背景进行解释。 首先,我们来看单件模式。单件模式确保一个类只有...

    《设计模式》实战---状态模式(State Pattern)

    8. **工具应用**:在实际开发中,状态模式常常与其他设计模式结合使用,如工厂模式用于创建状态对象,策略模式用于更灵活的状态行为选择。此外,一些现代编程语言提供了枚举类或类似功能,可以简化状态模式的实现。 ...

    C++设计模式课件4_策略模式.pdf

    设计模式通常分为三大类:创建型模式、结构型模式和行为型模式。 #### 策略模式动机分析 在软件开发过程中,经常会遇到需要根据不同的条件选择不同的算法或行为的情况。例如,在一个游戏中,角色可能会根据当前的...

    设计模式 策略模式

    例如,在游戏中,角色的行为可能因玩家的选择或游戏状态而变化,通过策略模式,可以轻松地切换角色的攻击策略或防御策略。 在学习策略模式时,除了理解其基本概念,还需要掌握如何在实际项目中应用和扩展。这包括...

    设计模式——策略模式

    策略模式的核心组成部分包括环境(Context)角色、策略(Strategy)接口和具体策略(Concrete Strategy)类。环境角色是使用策略的角色,它维持一个对策略对象的引用,并在适当的时候调用策略对象的方法来执行相应的...

    headfirst 策略模式代码

    总的来说,Headfirst的策略模式例子展示了如何通过接口和多态来实现行为的动态切换。这种模式在需要多种行为选择,或者希望行为能够在运行时改变的场景下特别有用。在Java等面向对象语言中,策略模式可以有效地降低...

    设计模式-状态模式.pdf

    - 状态模式和策略模式虽然有相似的类图,但它们的意图不同。状态模式是通过改变对象内部的状态来控制对象的行为。 - 上下文将与状态相关的操作委托给当前的具体状态对象处理。 - 上下文可以将自身作为一个参数...

    策略模式在android中使用

    在Android中,策略模式常常用于处理复杂的业务逻辑或者多种状态的切换。例如,在一个应用中,可能有多种不同的排序方式,如按时间、按评分等,每种排序方式都可以看作是一个策略。我们可以定义一个`SortStrategy`...

    python 实现 状态模式

    - **状态模式4**:可能引入了更复杂或更优化的实现,比如使用策略模式结合状态模式,或者用更高级的Python特性如上下文管理器。 状态模式的优点包括: - **减少条件分支**:通过将状态行为封装在独立的类中,可以...

    策略(strategy)模式

    在策略模式中,我们创建表示各种策略的对象和一个行为根据策略对象改变的上下文对象。策略对象改变上下文对象的执行算法。策略模式可以定义一系列的算法,并将每一个算法封装起来,让它们之间可以互相替换,让算法的...

    《Java设计模式》详解

    内容包括统一建模语言基础知识、面向对象设计原则、设计模式概述、简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式...录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式...

Global site tag (gtag.js) - Google Analytics