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

角色和职责:

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. Matlab Tricks(二十二)—— 自定义函数

    printme = @(txt) print('-dpdf', sprintf('figures/Example_%s',txt)); % 这里的 print 显然不是控制台输出一句话,而是图像的命名 ...

  2. BZOJ 3594 Scoi2014 方波波麦田 树阵

    标题效果:给定一个序列,能够选择k次每个部分的数量和在范围内+1,寻求操作后LIS最大值 我的做法是不是一个标准的解决方案. ..5E为什么跑飞的复杂性. . . 首先,显而易见的结论是,我们选择k右 ...

  3. Invalid default value for 'created_at'

    https://github.com/laravel/framework/issues/15144 https://stackoverflow.com/questions/30555844/larav ...

  4. MVC 异步调用

    @{    Layout = null;}<!DOCTYPE html><html><head>    <meta name="viewport&q ...

  5. C# WebRequest WebResponse的使用

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  6. CreateThread传递多个参数的方法(利用结构体的参数指针)

    很多朋友一直都在问CreateThread如何传递多个参数,CreateThread传递参数的方式是指针传递的,所以这里也可以利用指针来做!Demo 关键代码如下: type  TfrmTestThr ...

  7. 前端开发常用PhotoShop快捷键整理(更新中)

    图片来源 UI提供的psd图 印屏幕:PrScrn SysRq(键盘按键) 浏览器(插件)获取 常用的快捷键: 新建 Ctrl + N 取消选框 Ctrl + D 反选 Ctrl + shift + ...

  8. 毕设(三)NotifyIcon

    NotifyIcon是一个比较特殊的组件,其特殊之处是既可以把它归类到控件中,也可以把它归类到组件中.这是因为将其拖放到设计窗体后,我们并不能马上看到它的界面(像组件),而是在运行时才能看到它(像控件 ...

  9. 修改用户名后TSF出现"需要本地工作区。工作区 xxx 并未驻留在本计算机上"

    解决方法就是:1,打开vs下的"开发人员命令提示"2,按下面格式输入命令:tf workspaces /collection:http://192.168.0.110:8080/t ...

  10. java基础之super关键字

    一.在java里面,对于super关键字通常有两种用法: 1. 用在子类的构造方法里(初始化用),主要是调用父类的默认构造方法,如果父类有不止一个构造方法,可以通过super指定具体的构造函数,比如 ...