文档章节

【行为型】- 状态模式

ZeroneLove
 ZeroneLove
发布于 02/23 11:14
字数 804
阅读 23
收藏 0

状态模式

允许1个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。

角色

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

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

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


上下文环境:Context

package com.zhiwei.state;
public class Context {

    /**
    * 上下文内部维护的状态对象,使用接口是为了管理一类的接口可引用的对象实现状态的转移,同时可以了解上下文的状态
    */
    private State state;  

    /**
    * 上下文实例化时设置上下文的的出初始状态
    */
    public Context() {
        state = new CreatingState();
    }

    /**
    * 获取上下文当前的状态信息
    * @return
    */
    public State getState() { 
        return state;
    }

    /**
    * 状态转移时重新设置新的状态
    * @param state
    */
    public void setState(State state) { 
        this.state = state;
    }

    public void handle() {  
    //处理状态改变的事件:本质调用具体状态对象的回掉方法,在状态对象内部设置新的状态
        state.handle(this);
    }
}

抽象状态:State

public interface State {

    /**
        * 处理本状态下的业务逻辑,同时设置上下文流程的下一种状态
        * @param document
        */
    void handle(Context context);
}

具体状态:列表

package com.zhiwei.state;

/**
 * 公文创建状态对象
 * @author Yang ZhiWei
 *
 */
public class CreatingState implements State {
    
    /**
        * 状态对象实际的业务逻辑处理,处理完成之后
        * 设置下一步流程的上下文状态
        */
    public void handle(Context context) {
        
        System.out.println("公文已创建完成......");
        context.setState(new CreatedState());
    }
}
package com.zhiwei.state;

public class CreatedState implements State {
	
    public void handle(Context context) {
        
        System.out.println("公文已发送一级主管......");
        context.setState(new SendOneChargeState());
    }
}
package com.zhiwei.state;
public class SendOneChargeState implements State {
   
    public void handle(Context context) {
        
        //一级主管应该处理代码
        System.out.println("公文已发送一级主管......");
        context.setState(new SendSuperChargeState());
    }
}
package com.zhiwei.state;

public class SendSuperChargeState implements State {
    
    public void handle(Context context) {
        //二级主管应该处理的代码
        context.setState(new ApprovedState());
        System.out.println("公文已审批完成......");
    }
}
package com.zhiwei.state;
public class ApprovedState implements State {
    
    public void handle(Context context) {
        //审批完成应该处理代码
        System.out.println("公文已结束......");
    }
}

测试代码:

//初始化上下文对象,并设置初始状态
Context context = new Context();  

context.handle();  
context.handle();
context.handle();
context.handle();
context.handle();

通俗解释:

员工A要辞职,A首先填好辞职申请书(上下文对象),整个公司的辞职流程审批链:

组长-->主管-->经理-->人力资源部(状态),只有每个流程都走完才行。

特点:用于处理一个确定的工作流程,如果分层次处理对应的流程的话,可使用责任链模式(一步到位),就不需为每个不同的对象设计不同的工作流程。

工作流产品:Activiti/JBPM

© 著作权归作者所有

ZeroneLove
粉丝 5
博文 164
码字总数 133695
作品 0
深圳
高级程序员
私信 提问
设计原则和设计模式_Index

设计原则 1.1 什么是设计原则 ?(https://my.oschina.net/jimilee/blog/732569) 1.2 设计原则如何用? 1.3 设计原则详解 1.4 30分钟快速理解面向对象设计原则 2. 设计模式 2.1 什么时候使用设...

无寄语
2016/08/14
1
0
《魂斗罗归来》之状态模式VS策略模式

欢迎收看俗到掉渣的《小Y讲堂》节目,大家好,我是小Y,一个集性感毛发与才华于一身的程序猿。小Y的设计模式系列中的「状态模式」和「策略模式」都已经总结完成了,很多小伙伴都会凌乱在这两种...

YoungManSter
2017/11/03
0
0
数据与行为——状态模式与策略模式

我在另一篇博客里声称:做技术的思路是优先“怎么用”、而后再“是什么”。然而这里,我却想讨论一下状态模式与策略模式“是什么”,以及它们之间的区别。 这并不是打脸,而是我在经过长久的...

winters1224
2017/08/27
0
0
小菜学设计模式——设计模式总结之行为型(2)

1、设计模式总结 设计模式总共23个,但是常用的不到10个,下面就把这23个设计模式进行整理归类,具体如下: 1)创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型...

learn_more
2015/07/10
143
0
设计模式-状态模式

模式定义: 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 模式结构 代码实现 模式的优缺点 模式的优点 简化应用逻辑控制 状态模式使用单独的类来封装一个状态...

wjk_snail
2016/08/18
7
0

没有更多内容

加载失败,请刷新页面

加载更多

rime设置为默认简体

转载 https://github.com/ModerRAS/ModerRAS.github.io/blob/master/_posts/2018-11-07-rime%E8%AE%BE%E7%BD%AE%E4%B8%BA%E9%BB%98%E8%AE%A4%E7%AE%80%E4%BD%93.md 写在开始 我的Arch Linux上......

zhenruyan
今天
5
0
简述TCP的流量控制与拥塞控制

1. TCP流量控制 流量控制就是让发送方的发送速率不要太快,要让接收方来的及接收。 原理是通过确认报文中窗口字段来控制发送方的发送速率,发送方的发送窗口大小不能超过接收方给出窗口大小。...

鏡花水月
今天
10
0
OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
今天
1K
11
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部