状态模式 java && php
状态模式 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的更多相关文章
- 设计模式之第21章-状态模式(Java实现)
设计模式之第21章-状态模式(Java实现) “what are you 干啥了?怎么这么萎靡不振?”“昨晚又是补新番,又是补小笼包,睡得有点晚啊.话说杨过的那个雕兄真是太好了,每天给找蛇胆,又陪练武 ...
- StatePattern(状态模式)-----Java/.Net
在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式. 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context ...
- JAVA 设计模式 状态模式
用途 状态模式 (State) 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式是一种行为型模式. 结构
- JAVA设计模式--State(状态模式)
状态模式(State Pattern)是设计模式的一种,属于行为模式. 定义(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要 ...
- Java设计模式系列之状态模式
状态模式(State)的定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它 ...
- java 状态模式 解说演示样例代码
package org.rui.pattern; import junit.framework.*; /** * 为了使同一个方法调用能够产生不同的行为,State 模式在代理(surrogate)的 ...
- JAVA设计模式:状态模式
声明:转载请说明来源:http://www.cnblogs.com/pony1223/p/7518226.html 一.引出状态模式 假设我们现在有一个糖果机项目,那么我们知道正常一般糖果机提供给用户 ...
- java设计模式---状态模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述状态(State)模式的: 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为 ...
- Java进阶篇设计模式之十二 ---- 备忘录模式和状态模式
前言 在上一篇中我们学习了行为型模式的策略模式(Strategy Pattern)和模板模式(Template Pattern).本篇则来学习下行为型模式的两个模式,备忘录模式(Memento Pat ...
随机推荐
- mysql 主主复制(双主复制)+ 配置KEEPALIVED实现热备
binlog-do-db和replicate-do-db表示需要同步的数据库 binlog-ignore-db和replicate-ignore-db表示不需要同步的数据库 云端服务器为master配 ...
- 对学长所谓“改变世界的游戏”《shield star》的运行感想-毛宇部分(完整版本请参考团队博客)
对于学长项目<shield star>的思考和看法: Ryan Mao ((毛宇) 110616-11061171 试用了一下学长黄杨等人开发的<shield star>游戏 ...
- 【Tyvj】1473校门外的树3 线段树/树状数组 <区间修改+单点访问>
描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的……如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作:K=1,读入l,r表示在l ...
- Gym 100637F F. The Pool for Lucky Ones
F. The Pool for Lucky Ones Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/10 ...
- ToggleButton
<ToggleButton android:id="@+id/toggle" android:layout_width="wrap_content" an ...
- 用JAXP的dom方式解析XML文件
用JAXP的dom方式解析XML文件,实现增删改查操作 dom方式解析XML原理 XML文件 <?xml version="1.0" encoding="UTF-8 ...
- javascript优化--02高质量编码
方法调用: 通常某个对象调用方法查找该方法并将该对象作为该方法的接受者(this): 使用call自定义接受者 可以调用在给定对象中不存在的方法: 定义高阶函数,允许使用者给回调函数指定接受者: 使用 ...
- node工具--express
//使用supervisor Connect是基于HTTP米快创建的:Express则是基于Connect上创建的: 绝大多数web服务器和浏览器之间的任务是通过url和method完成的,两者的组 ...
- cocos2d menu菜单类
// 在init这个函数当中做一些初始化的事情 bool HelloWorld::init() { ////////////////////////////// // 先构造父级对象 if ( !CC ...
- BZOJ3595 : [Scoi2014]方伯伯的Oj
由于n很大,有2e8,所以不能直接用splay来维护排名 把splay修改一下 每个节点维护一个区间[l,r],表示编号在[l,r]之间的所有点都在这里 需要支持一个takeout操作: 把编号为k的 ...