状态模式的应用

前景:

xx公司要启动一个项目,这个项目的需求是合同协议管理,需求分别为:

1.  合作的过程中创建一份协议。

2.  协议开始的过程中可以暂停和恢复。

3.  当然合作可以延长合作时间和提前结束,不管哪一种都要算服务天数,因为费用是按天计算的。

4.  财务可以看到本月实际的营业额。

接到需求之后就有人开始编码了(这是国内的习惯):

协议创建的时候的合法性检测:

#检测是否存在合作中的协议
.....
$isCooperation = Agreement::model()->exists("nick=? and begin_date>=? and end_date<=?",array(‘xx‘,date(),date()));
if($isCooperation){
     throw new Exception("存在合作中的协议,无法新建");
}

#检测是否有暂停的协议
$isExistsStop =  Agreement::model()->exists("nick=? and status=?",array(‘xx‘,‘stop‘));

if($isExistsStop){
      throw new Exception("存在暂停的协议,无法新建");
}

......

  协议开始的时候的合法性检测:

#检测是否存在为开始状态的协议
$agreement = Agreement::model()->find("nick=? and status=? begin_date>=? and end_date<=?",array(‘xx‘,‘NotStart‘,date(),date()));

if($agreement == null){
     throw new Exception("未找到开始状态的订单");
}

$agreement->start_date = date();
$agreement->status = ‘Start‘;
$agreement->save();
......

  协议暂停的时候的合法性检测:

同上,状态越来越多 的时候,我们就越来越麻木了,不知道当前的动作会转变成什么状态,前置状态是否合理。

解决这一问题,我们引进下设计模式这个概念,其实代码基础还是不会变,只是转成了另外一种表现形式。

分析下我们从需求中提出动词:

1. 开始 (Start)

2. 暂停 (Pause)

3. 恢复 (Resume)

4. 终止 (Over)

5. 续约 (Review)

根据状态,我们列出以下状态:

1. 未开始(NotStart)

2. 服务中 (Start)

3. 暂停服务 (Pause)

4. 服务结束 (Over)

我们在来列一份表格

    未开始     服务中     暂停服务     服务结束  
  开始     服务中   error   error     error
  暂停   error   暂停服务   error   error
  恢复   error   error   服务中   error
  终止      服务结束   服务结束   服务结束   服务结束
  续约   未开始   服务中   error   未开始/服务中  

这份表格代表着状态的转化过程。

状态模式解读:http://www.cnblogs.com/wangjq/archive/2012/07/16/2593485.html

1. 概述

  当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

2. 解决的问题

  主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同的一系列类当中,可以把复杂的逻辑判断简单化。

3. 模式中的角色

  3.1 上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的Concrete State对象来处理。

  3.2 抽象状态(State):定义一个接口以封装使用上下文环境的的一个特定状态相关的行为。

  3.3 具体状态(Concrete State):实现抽象状态定义的接口。

状态模式的应用

时间: 2024-08-02 18:18:19

状态模式的应用的相关文章

大话设计模式读书笔记--12.状态模式

定义 状态模式定义: 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来改变了其类 消除庞大的条件分支,将特定状态的行为放入一个对象中 生活中:开灯和关灯是两个状态 模式结构 Context: 上下文环境,维护一个状态实例,定义当前的状态 State: 抽象状态类,定义一个接口,封装与Context的一个特定状态相关的行为 ConcreteState:具体状态.实现Context的一个特定状态相关的行为 代码实现 场景: 12店之前是休闲状态, 之后是忙碌状态 点击下载代码 特点及使用场

设计模式整理_状态模式

状态模式允许对象在内部状态改变的时候,改变它的行为,对象看起来好像修改了它的类.因为这个模式将状态封装成为独立的类,并将动作委托到代表当前状态的对象,而行为会随着内部状态而改变. 在状态模式中,Context内部持有状态,State接口定义了一个所有具体状态的共同接口,任何状态都实现这个相同的接口,这样一来,各个状态可以互相替换.具体状态实现状态接口,所以当Context改变状态的时候,行为也跟着改变.而不管在什么时候,只要有人调用Context的具体方法,它就会用来委托状态处理,下面用具体事例

大量逻辑判断优化的思路——责任链模式复习总结及其和状态模式对比

俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的总结知识点如下: 责任链模式概念和例子 使用的条件 和状态模式的比较分析 责任链的优缺点 纯的责任链和不纯的责任链 javax.servlet.Filter#doFilter()方法源码分析 基于AOP思想,模拟一个拦截器 前面说了一个状态模式,总结过程中发现和这个责任链的使用场景很类似,都是为了解耦大量复杂业务逻辑判断的,那么他们有什么不同呢?回忆状态模式——状态模式允许通过改变对象的内部状态而改变对象自身的行为,这个对象

第十六章 状态模式

好处:将与特定状态相关的行为局部化,并将不同状态的行为分割开来. 当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式. /** * Created by hero on 16-4-4. */ public abstract class State { public abstract void handle(Context context); } /** * Created by hero on 16-4-4. */ public class Con

23状态模式

 1状态模式的核心内容是: A:状态类 B:工作类 2状态模式的作用:通过状态值自动跳转到要执行的类. 3状态模式具体描述 状态模式:状态模式允许一个对象在其内部状态改变的时候改变行为. 这个对象看上去象是改变了它的类一样.状态模式把所研究的对象的行 为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的 一个子类.状态模式的意图是让一个对象在其内部状态改变的时候, 其行为也随之改变.状态模式需要对每一个系统可能取得的状态创立一个状态类的 子类.当系统的状态变化时,系统便改变所选的子

学习日记之状态模式和Effective C++

状态模式(State):当一个对象内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类. (1),状态模式主要负责解决的是当控制一个对象转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化. (2),状态模式的好处是将与特定状态相关的行为局部化,并且将不同状态的行为分割开来. (3),将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易地增加新的状态和

Java设计模式(十) 备忘录模式 状态模式

(十九)备忘录模式 备忘录模式目的是保存一个对象的某个状态,在适当的时候恢复这个对象. class Memento{ private String value; public Memento(String value){ this.value = value; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } } class Storage

State状态模式(C++实现)

状态模式:状态模式的意图是,允许一个对象在其内部状态改变时,改变它的行为.看起来就像是改变了它的类一样. 主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同的一系列类当中,可以把复杂的逻辑判断简单化. 类图如下图所示 State类,抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为.ConcreteState类,具体状态,每一个子类实现一个与Context的一个状态相关的行为.Context类,维护一个ConcreteState子类

设计模式(20)--State(状态模式)--行为型

作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式. 状态模式允许一个对象在其内部状态改变的时候改变其行为.这个对象看上去就像是改变了它的类一样. 2.模式特点: 状态模式的主要优点在于封装了转换规则,并枚举可能的状态,它将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为,还可以

【设计模式】 模式PK:策略模式VS状态模式

1.概述 行为类设计模式中,状态模式和策略模式是亲兄弟,两者非常相似,我们先看看两者的通用类图,把两者放在一起比较一下. 策略模式(左)和状态模式(右)的通用类图. 两个类图非常相似,都是通过Context类封装一个具体的行为,都提供了一个封装的方法,是高扩展性的设计模式.但根据两者的定义,我们发现两者的区别还是很明显的:策略模式封装的是不同的算法,算法之间没有交互,以达到算法可以自由切换的目的:而状态模式封装的是不同的状态,以达到状态切换行为随之发生改变的目的.这两种模式虽然都有变换的行为,但