状态模式是行为模式的一种,状态模式允许改变对象内部状态来改变对象的行为。

角色和职责:

1.上下文(Context)-Order

   拥有内部的状态

2.状态接口(Status)-State:

一个所有具体状态的共同接口;任何状态都实现这个相同的接口,这样一来状态之间可以互相替换

3.具体状态(Concrete State)-:

UML图:

具体源码:

/**
* 状态接口类
*/
public abstract class State {
protected int owner_order_status = 0;//当前状态对象的具体状态
protected State next_state;//当前状态的下一个状态
public State(int owner_order_status,State next_state){
this.owner_order_status = owner_order_status;
this.next_state = next_state;
} /**
* 处理
* @param orderStatus
*/
protected void handler(int orderStatus){
if(!isOwner(owner_order_status,orderStatus)){
if(next_state != null){
//非当前对象,继续到下一个对象中查找
next_state.handler(orderStatus);
return;
}
System.out.println("当前订单状态未定义");
return;
}
diaplay();
} /**
* 是否当前对象
* @return
*/
public boolean isOwner(int owner_order_status,int orderStatus){
if(owner_order_status == orderStatus){
return true;
}
return false;
} abstract void diaplay();
}
/**
* 订单创建
*/
public class OrderCreateState extends State
{
public OrderCreateState(int owner_order_status, State next_state) {
super(owner_order_status, next_state);
} @Override
void diaplay() {
System.out.println("订单创建");
}
}
/**
* 订单支付
*/
public class OrderPayState extends State { public OrderPayState(int owner_order_status, State next_state) {
super(owner_order_status, next_state);
} @Override
void diaplay() {
System.out.println("订单支付");
}
}
/**
* 订单完成
*/
public class OrderSuccessState extends State{
public OrderSuccessState(int owner_order_status, State next_state) {
super(owner_order_status, next_state);
} @Override
void diaplay() {
System.out.println("订单完成");
}
}
/**
* 订单状态关闭
*/
public class OrderCloseState extends State{
public OrderCloseState(int owner_order_status, State next_state) {
super(owner_order_status, next_state);
} @Override
void diaplay() {
System.out.println("订单状态关闭");
}
}
/**
* 订单
*/
public class Order {
private State orderState;
public Order(){
orderState = new OrderCreateState(1,
new OrderPayState(2,
new OrderSuccessState(3,
new OrderPayState(4,null))));
} public State getOrderState() {
return orderState;
}
}
public class Main {
public static void main(String[] args) {
Order order = new Order();
State orderState = order.getOrderState();
orderState.handler(1);//订单创建
orderState.handler(2);//订单支付
orderState.handler(3);//订单完成
orderState.handler(4);//订单关闭
orderState.handler(5);//订单未定义
}
}

结果:

订单创建
订单支付
订单完成
订单支付
当前订单状态未定义

源码地址:https://github.com/qjm201000/design_pattern_state.git

设计模式-状态模式(State)的更多相关文章

  1. C#设计模式——状态模式(State Pattern)

    一.概述在面向对象软件设计时,常常碰到某一个对象由于状态的不同而有不同的行为.如果用if else或是switch case等方法处理,对象操作及对象的状态就耦合在一起,碰到复杂的情况就会造成代码结构 ...

  2. 大话设计模式--状态模式 State -- C++实现实例

    1.状态模式: 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来就像是改变了其类. 状态模式解决的是当控制一个对象状态转换的条件表达式过于复杂, 把状态的判断逻辑转移到表示不同状态的一系列类 ...

  3. 深入浅出设计模式——状态模式(State Pattern)

    模式动机 在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的 (stateful)对象,这样的对象状态是从事先定义好的一系列值中取出的.当一个这样的 ...

  4. 【转】设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...

  5. 设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...

  6. 乐在其中设计模式(C#) - 状态模式(State Pattern)

    原文:乐在其中设计模式(C#) - 状态模式(State Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 状态模式(State Pattern) 作者:webabcd 介绍 允 ...

  7. 北风设计模式课程---状态模式State(对象行为型)

    北风设计模式课程---状态模式State(对象行为型) 一.总结 一句话总结: 状态模式 具体状态的行为在具体的状态类中就解决,不用交给外部做判断.实质是将多条件判断弄成了多个类,在不同的类中做判断 ...

  8. 状态模式(State)-设计模式

    软件模式是将模式的一般概念应用于软件开发领域,即软件开发的 总体指导思路或参照样板.软件模式并非仅限于设计模式,还包括 架构模式.分析模式和过程模式等,实际上,在软件生存期的每一个阶段都存在着一些被认 ...

  9. 二十四种设计模式:状态模式(State Pattern)

    状态模式(State Pattern) 介绍允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它所属的类. 示例有一个Message实体类,对它的操作有Insert()和Get()方法, ...

  10. JAVA 设计模式 状态模式

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

随机推荐

  1. Easyui Tab刷新

    Easyui Tab刷新: function refreshTab(title){ var tab = $('#id').tab('getTab',title); $('#id').tab('upda ...

  2. uboot通过使用U磁盘引导内核RT5350成功

    今天,在下次尝试使用16G 的u菜.这让两个分区,A位于zimage.一家商店rootfs:在uboot加载分区zimage并成功推出! RT5350 # fatload usb 0:1 0x80c0 ...

  3. abp.message

    abp.message.success(app.localize('SomeMessage'), app.localize('Title')) .done(function() { //do some ...

  4. 反编译 war 包成传统项目的方法

    需求 项目老大让外包做了官网,不甚满意,想自己搞搞,遂叫我反编译他们发过来的 war 包. 方法 第一步:解压 war 包其实就是 zip 压缩包,用 zip 解压. 第二步:反编译 查看 war 包 ...

  5. 解决Android Studio运行时报Error:java.lang.NullPointerException (no error message)错误

    原文:解决Android Studio运行时报Error:java.lang.NullPointerException (no error message)错误                    ...

  6. java设计模式(2)

    工厂模式定义 在面向对象程序设计中,工厂通常是用来创建其他对象的对象,工产模式根据不同的参数来实现不同的分配方案和创建对象. 在工产模式中,我们创建对象时不会对客户端暴露创建逻辑,而且是通过使用一个共 ...

  7. DevExpress的xtraMessageBox汉化

    原文:DevExpress的xtraMessageBox汉化 项目使用的界面库是DevExpress 相当好用,不过里面弹出对话框XtraMessageBox的按钮都是英文的, 可能会对用户造成困扰, ...

  8. 一个技术人,最重要的是:极客精神(好奇心 + 探索欲)(新de代码)

    一个技术人,最重要的是:极客精神(好奇心 + 探索欲) 初到社会,面对众多的IT企业,我们是陌生与好奇的,认为所有企业都是管理一流并且高大上等的.然而工作多年以后你会发现,国内的IT企业环境良莠不齐, ...

  9. 【码云周刊第 32 期】程序员眼中的 Vue 与 Angular !

    码云项目推荐 基于 Vue 的项目: 1.项目名称:基于 Vue.js 的 UI 组件库 项目简介:iView 是一套基于 Vue.js 的 UI 组件库,主要服务于 PC 界面的中后台产品. 项目地 ...

  10. 使用xargs同步文本中单词出现个数

    #!/bin/bash # 分析一个文本文件中单词出现的频率. # 使用 'xargs' 将文本行分解为单词. # 检查命令行上输入的文件. ARGS= E_BADARGS= E_NOFILE= if ...