状态模式 java && php

 
 

状态模式

输入信号是事件;输出是状态结果,状态模式状态机就是一个黑盒子。
状态模式主要突出了两个字:”改变”,对象的状态决定了状态的行为,事物的本质决定了事物的行为。
对一个状态特别重要的对象,通过状态机来建模一个对象的状态;
状态模式处理的核心问题是状态的迁移,因为在对象存在很多状态情况下,
对各个business flow,各个状态之间跳转和迁移过程都是及其复杂的。
例如一个工作流,审批一个文件,存在新建、提交、已修改。
HR部门审批中、老板审批中、HR审批失败、老板审批失败等状态,涉及多个角色交互,涉及很多事件,
这种情况下用状态模式(状态机)来建模更加合适;
把各个状态和相应的实现步骤封装成一组简单的继承自一个接口或抽象类的类,
通过另外的一个Context来操作他们之间的自动状态变换,通过event来自动实现各个状态之间的跳转
参与者:       
  Context(环境,Person)定义客户感兴趣的类。
  State(Moodstate):定义一个接口以封装与Context的一个特定状态相关的行为
  ConcreteState Subclasses(具体状态子类,如Angry)每一个子类实现一个与Context的状态相关的行为。
他们的协作关系是:
  Context将于状态相关的请求委托给当前的ConcreteState对象处理。
  Context可将自身作为一个参数传递给处理该请求的状态对象,这使得状态对象在必要的时候可访问Context。
  Context是客户使用的主要接口,客户可用状态对象来配置一个Context,一旦一个Context配置完毕,他的客户不再需要直接与状态对象打交道。
  Context或者ConcreteState子类都可以决定哪个状态是另外那个状态的后继者,以及是在何种条件下进行状态转换。

Context:

public class Persion {
private MoodState state; public Persion(){
state = new Mad(this);//开始默认为抓狂状态
} public void setState(MoodState state) {
this.state = state;
} public void request(){
state.doSomething();
state.changeState();
} } 状态接口:
public interface MoodState {
public void doSomething(); public void changeState();
} 抓狂状态:
public class Mad implements MoodState { Persion persion;
public Mad(Persion persion){
this.persion = persion;
} public void changeState() {
persion.setState(new Angry(persion));
} public void doSomething() {
System.out.println("I'm Mad!"); } } 生气状态:
public class Angry implements MoodState { Persion persion; public Angry(Persion persion){
this.persion = persion;
} public void changeState() {
persion.setState(new Happy(persion));
} public void doSomething() {
System.out.println("I'm Angry!");
} } 高兴状态:
public class Happy implements MoodState { Persion persion; public Happy(Persion persion){
this.persion = persion;
}
public void changeState() {
persion.setState(new Mad(persion));
} public void doSomething() {
System.out.println("I'm Happy!");
} }
 /**
* 状态模式
*
* 允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它所属的类
*
*/
interface State
{
public function handle($state);
public function display();
} class Context
{
private $_state = null; public function __construct($state)
{
$this->setState($state);
} public function setState($state)
{
$this->_state = $state;
} public function request()
{
$this->_state->display();
$this->_state->handle($this);
}
} class StateA implements State
{
public function handle($context)
{
$context->setState(new StateB());
} public function display()
{
echo "state A<br/>";
}
} class StateB implements State
{
public function handle($context)
{
$context->setState(new StateC());
} public function display()
{
echo "state B<br/>";
}
} class StateC implements State
{
public function handle($context)
{
$context->setState(new StateA());
} public function display()
{
echo "state C<br/>";
}
} // 实例化一下
$objContext = new Context(new StateB());
$objContext->request();
$objContext->request();
$objContext->request();
$objContext->request();
$objContext->request(); ?>

状态模式 java && php的更多相关文章

  1. 设计模式之第21章-状态模式(Java实现)

    设计模式之第21章-状态模式(Java实现) “what are you 干啥了?怎么这么萎靡不振?”“昨晚又是补新番,又是补小笼包,睡得有点晚啊.话说杨过的那个雕兄真是太好了,每天给找蛇胆,又陪练武 ...

  2. StatePattern(状态模式)-----Java/.Net

    在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式. 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context ...

  3. JAVA 设计模式 状态模式

    用途 状态模式 (State) 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式是一种行为型模式. 结构

  4. JAVA设计模式--State(状态模式)

    状态模式(State Pattern)是设计模式的一种,属于行为模式. 定义(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要 ...

  5. Java设计模式系列之状态模式

    状态模式(State)的定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它 ...

  6. java 状态模式 解说演示样例代码

    package org.rui.pattern; import junit.framework.*; /** * 为了使同一个方法调用能够产生不同的行为,State 模式在代理(surrogate)的 ...

  7. JAVA设计模式:状态模式

    声明:转载请说明来源:http://www.cnblogs.com/pony1223/p/7518226.html 一.引出状态模式 假设我们现在有一个糖果机项目,那么我们知道正常一般糖果机提供给用户 ...

  8. java设计模式---状态模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述状态(State)模式的: 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为 ...

  9. Java进阶篇设计模式之十二 ---- 备忘录模式和状态模式

    前言 在上一篇中我们学习了行为型模式的策略模式(Strategy Pattern)和模板模式(Template Pattern).本篇则来学习下行为型模式的两个模式,备忘录模式(Memento Pat ...

随机推荐

  1. 查看MySQL配置文件路径及相关配置

    [root@DB ~]# /usr/local/mysql/bin/mysqld --verbose --help |grep -A 1 'Default options' Default optio ...

  2. C# this和base

    base关键字:其用于在派生类中实现对基类公有或者受保护成员的访问,但是只局限在构造函数.实例方法和实例属性访问器中,还有指定创建派生类实例时应调用的基类构造函数. this关键字:限定被相似的名称隐 ...

  3. Android读书笔记0-从零开始

    可以有千万个理由,但是结果就在这里,我开始对Android产生兴趣,于是决定学点啥.啥都不说,单刀入正题. 开发环境 啥都不说,直接上图. 只说Windows平台上,下载完直接解压即可.比起VS安装过 ...

  4. Hark的数据结构与算法练习之计数排序

    算法说明 计数排序属于线性排序,它的时间复杂度远远大于常用的比较排序.(计数是O(n),而比较排序不会超过O(nlog2nJ)). 其实计数排序大部分很好理解的,唯一理解起来很蛋疼的是为了保证算法稳定 ...

  5. JVM的类加载机制

    虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 类加载的过程: 包括加载.链接(含验证.准备 ...

  6. SU sugethw命令学习

  7. 手持PDA智能条码扫描RFID打印POS机

    手持PDA智能条码扫描RFID打印POS机   一.系统稳定性: 1.硬件稳定性: 采用了华为海思(国内唯一可以媲美全球顶级的CPU+射频方案厂商,可以和英伟达等一决高下)手机方案,CPU+射频浑然一 ...

  8. StringUtils中 isNotEmpty 和isNotBlank的区别【java字符串判空】

    isNotEmpty(str)等价于 str != null && str.length > 0 isNotBlank(str) 等价于 str != null &&am ...

  9. 【python游戏编程之旅】第五篇---嗷大喵爱吃鱼小游戏开发实例

    本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 我们一同在前几期的博客中已经学到了很多pygame的基本知识了,现在该做个小游戏实战一下了. 前几期博客链接 ...

  10. 稳定的奶牛分配 && 二分图多重匹配+二分答案

    题意: 农夫约翰有N(1<=N<=1000)只奶牛,每只奶牛住在B(1<=B<=20)个奶牛棚中的一个.当然,奶牛棚的容量有限.有些奶牛对它现在住的奶牛棚很满意,有些就不太满意 ...