`
conkeyn
  • 浏览: 1525160 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

状态模式和策略模式

 
阅读更多

策略模式:
商场促销方案,可以有多种:买X返Y,Z折扣,积分,直降A。
一次促销活动可以只选择其中的一种促销策略,彼此之间没有影响。

状态模式:
一个人一天的工作状态:早上精神百倍,下午还好,晚上很累。
早中晚各是一种状态,但只有三种状态联合起来,才能完成“一天的状态”这件事情,相当于把一天的状态分成了三个部分了。

 

    状态模式(state pattern)和策略模式(strategy pattern)的实现方法非常类似,都是利用多态把一些操作分配到一组相关的简单的类中,因此很多人认为这两种模式实际上是相同的。然而
    在现实世界中,策略(如促销一种商品的策略)和状态(如同一个按钮来控制一个电梯的状态,又如手机界面中一个按钮来控制手机)是两种完全不同的思想。当我们对状态和策略进行建模时,这种差异会导致完全不同的问题。例如,对状态进行建模时,状态迁移是一个核心内容;然而,在选择策略时,迁移与此毫无关系。另外,策略模式允许一个客户选择或提供一种策略,而这种思想在状态模式中完全没有。
    一个策略是一个计划或方案,通过执行这个计划或方案,我们可以在给定的输入条件下达到一个特定的目标。策略是一组方案,他们可以相互替换;选择一个策略,获得策略的输出。策略模式用于随不同外部环境采取不同行为的场合。我们可以参考微软企业库底层Object Builder的创建对象的strategy实现方式。
    而状态模式不同,对一个状态特别重要的对象,通过状态机来建模一个对象的状态;状态模式处理的核心问题是状态的迁移,因为在对象存在很多状态情况下,对各个business flow,各个状态之间跳转和迁移过程都是及其复杂的。例如一个工作流,审批一个文件,存在新建、提交、已修改、HR部门审批中、老板审批中、HR审批失败、老板审批失败等状态,涉及多个角色交互,涉及很多事件,这种情况下用状态模式(状态机)来建模更加合适;把各个状态和相应的实现步骤封装成一组简单的继承自一个接口或抽象类的类,通过另外的一个Context来操作他们之间的自动状态变换,通过event来自动实现各个状态之间的跳转。在整个生命周期中存在一个状态的迁移曲线,这个迁移曲线对客户是透明的。我们可以参考微软最新的WWF 状态机工作流实现思想。
    在状态模式中,状态的变迁是由对象的内部条件决定,外界只需关心其接口,不必关心其状态对象的创建和转化;而策略模式里,采取何种策略由外部条件(C)决定。

分享到:
评论

相关推荐

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

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

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

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

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

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

    设计模式-状态模式.pdf

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

    设计模式_行为型_状态模式.md

    - 状态模式可以看作是策略模式的一个特例,在策略模式中,上下文对象直接通过成员变量持有算法的引用,而在状态模式中,上下文通过调用状态类的方法来改变行为,并且状态类持有对上下文的引用。 ### 状态模式的...

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

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

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

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

    Android编程设计模式之状态模式详解

    状态模式和策略模式的结构几乎完全一样,但它们的目的、本质却完全不一样。状态模式的行为是平行的、不可替换的,策略模式的行为是彼此独立、可相互替换的。用一句话来表述,状态模式把对象的行为包装在不同的状态...

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

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

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

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

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

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

    23种设计模式c++实现代码

    C++中,可以结合状态模式和策略模式实现复杂的状态机。 23. 迭代器模式(Visitor):提供一种方法顺序访问聚合对象的元素,而又不暴露其底层表示。C++标准库中已经提供了迭代器概念,可以方便地应用于容器类。 ...

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

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

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

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

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

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

    设计模式 策略模式

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

    设计模式——策略模式

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

    headfirst 策略模式代码

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

    《Java设计模式》详解

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

Global site tag (gtag.js) - Google Analytics