状态模式=====java

转载 2012年03月29日 13:22:58
状态模式

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


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)

package com.lhever.practice;/** * 类似一个开关的对象,多次调用getCurrentValue()方法,返回值会进行有规律的切换 * * 写出这几个类只是为了复习...
  • nmgrd
  • nmgrd
  • 2017年04月20日 15:45
  • 313

状态模式-订单应用

今天翻了翻《领域驱动设计与模式实战》,里面详细讲解了“状态模式”,说来我对它并不陌生,几年前,我在看《Java与模式》的时候就仔细研究过,不过这么多年来却从没在实战中应用过,并不是没有遇到合适的场景,...
  • it_man
  • it_man
  • 2013年10月07日 15:54
  • 4766

Java设计模式之状态模式

本文属于"23种设计模式"系列,介绍状态模式。
  • jason0539
  • jason0539
  • 2015年04月14日 07:54
  • 14528

JAVA设计模式之 状态模式【State Pattern】

一、概述     当系统中某个对象存在多个状态,这些状态之间可以进行转换,而且对象在不同状态下行为不相同时可以使用状态模式。状态模式将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象状...
  • l416112167
  • l416112167
  • 2014年11月12日 23:48
  • 2705

Java中,状态模式和策略模式的区别

Java开发者,要想恰当的使用状态模式和策略模式,必须清楚的理解它们之间的区别。虽然状态模式和策略模式拥有相似的结构,虽然它们都基于SOLID设计原则中的O(开闭原则),但是,它们的意图是完全不同的。...
  • songwenbinasdf
  • songwenbinasdf
  • 2016年07月05日 15:22
  • 635

Java 设计模式——状态模式

很多人在说状态模式的时候总拿策略模式来进行对比,可能他们的类图会有一点类似,可我却不认为他们有多么相像。你可以阅读《Java设计模式——策略模式》这篇博客,并与本文对比,以找到蛛丝马迹。 他们最根本的...
  • u013761665
  • u013761665
  • 2016年06月06日 16:46
  • 8329

设计模式之策略模式与状态模式的区别

转策略模式与状态模式的比较状态模式(state pattern)和策略模式(strategy pattern)的实现方法非常类似,都是利用多态把一些操作分配到一组相关的简单的类中,因此很多人认为这两种...
  • u011040361
  • u011040361
  • 2015年04月19日 17:46
  • 846

Java设计模式——状态模式(STATE PATTERN)

场景一 描述:现在城市发展很快,百万级人口的城市一堆一堆的,那其中有两个东西的发明在城市的发展中起到非常重要的作用:一个是汽车,一个呢是...,猜猜看,是什么?是电梯!汽车让城市可以横向扩展,电梯让城...
  • u012401711
  • u012401711
  • 2016年09月26日 23:45
  • 3149

状态模式和策略模式比较

说到策略模式,我们最先想到的就是商店的收银方式:不满100,正常收费;超过100不满300,超过的部分打八折;超过300,全价九折!      解决这个问题最最普通的方法就是大量的If…Else…,而...
  • u010191243
  • u010191243
  • 2015年04月30日 16:37
  • 2475

状态模式——省去if-else的繁琐结构

一句话描述状态模式 定义功能接口,不同状态下的功能实现,定义状态接口,在controller中通过setState来实现后续不同行为的产生。 功能接口public interface Func...
  • qq_30124547
  • qq_30124547
  • 2016年11月12日 22:59
  • 1133
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:状态模式=====java
举报原因:
原因补充:

(最多只允许输入30个字)