设计模式-状态模式(State)
状态模式是行为模式的一种,状态模式允许改变对象内部状态来改变对象的行为。
角色和职责:
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)的更多相关文章
- C#设计模式——状态模式(State Pattern)
一.概述在面向对象软件设计时,常常碰到某一个对象由于状态的不同而有不同的行为.如果用if else或是switch case等方法处理,对象操作及对象的状态就耦合在一起,碰到复杂的情况就会造成代码结构 ...
- 大话设计模式--状态模式 State -- C++实现实例
1.状态模式: 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来就像是改变了其类. 状态模式解决的是当控制一个对象状态转换的条件表达式过于复杂, 把状态的判断逻辑转移到表示不同状态的一系列类 ...
- 深入浅出设计模式——状态模式(State Pattern)
模式动机 在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的 (stateful)对象,这样的对象状态是从事先定义好的一系列值中取出的.当一个这样的 ...
- 【转】设计模式 ( 十七) 状态模式State(对象行为型)
设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...
- 设计模式 ( 十七) 状态模式State(对象行为型)
设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...
- 乐在其中设计模式(C#) - 状态模式(State Pattern)
原文:乐在其中设计模式(C#) - 状态模式(State Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 状态模式(State Pattern) 作者:webabcd 介绍 允 ...
- 北风设计模式课程---状态模式State(对象行为型)
北风设计模式课程---状态模式State(对象行为型) 一.总结 一句话总结: 状态模式 具体状态的行为在具体的状态类中就解决,不用交给外部做判断.实质是将多条件判断弄成了多个类,在不同的类中做判断 ...
- 状态模式(State)-设计模式
软件模式是将模式的一般概念应用于软件开发领域,即软件开发的 总体指导思路或参照样板.软件模式并非仅限于设计模式,还包括 架构模式.分析模式和过程模式等,实际上,在软件生存期的每一个阶段都存在着一些被认 ...
- 二十四种设计模式:状态模式(State Pattern)
状态模式(State Pattern) 介绍允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它所属的类. 示例有一个Message实体类,对它的操作有Insert()和Get()方法, ...
- JAVA 设计模式 状态模式
用途 状态模式 (State) 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式是一种行为型模式. 结构
随机推荐
- Easyui Tab刷新
Easyui Tab刷新: function refreshTab(title){ var tab = $('#id').tab('getTab',title); $('#id').tab('upda ...
- uboot通过使用U磁盘引导内核RT5350成功
今天,在下次尝试使用16G 的u菜.这让两个分区,A位于zimage.一家商店rootfs:在uboot加载分区zimage并成功推出! RT5350 # fatload usb 0:1 0x80c0 ...
- abp.message
abp.message.success(app.localize('SomeMessage'), app.localize('Title')) .done(function() { //do some ...
- 反编译 war 包成传统项目的方法
需求 项目老大让外包做了官网,不甚满意,想自己搞搞,遂叫我反编译他们发过来的 war 包. 方法 第一步:解压 war 包其实就是 zip 压缩包,用 zip 解压. 第二步:反编译 查看 war 包 ...
- 解决Android Studio运行时报Error:java.lang.NullPointerException (no error message)错误
原文:解决Android Studio运行时报Error:java.lang.NullPointerException (no error message)错误 ...
- java设计模式(2)
工厂模式定义 在面向对象程序设计中,工厂通常是用来创建其他对象的对象,工产模式根据不同的参数来实现不同的分配方案和创建对象. 在工产模式中,我们创建对象时不会对客户端暴露创建逻辑,而且是通过使用一个共 ...
- DevExpress的xtraMessageBox汉化
原文:DevExpress的xtraMessageBox汉化 项目使用的界面库是DevExpress 相当好用,不过里面弹出对话框XtraMessageBox的按钮都是英文的, 可能会对用户造成困扰, ...
- 一个技术人,最重要的是:极客精神(好奇心 + 探索欲)(新de代码)
一个技术人,最重要的是:极客精神(好奇心 + 探索欲) 初到社会,面对众多的IT企业,我们是陌生与好奇的,认为所有企业都是管理一流并且高大上等的.然而工作多年以后你会发现,国内的IT企业环境良莠不齐, ...
- 【码云周刊第 32 期】程序员眼中的 Vue 与 Angular !
码云项目推荐 基于 Vue 的项目: 1.项目名称:基于 Vue.js 的 UI 组件库 项目简介:iView 是一套基于 Vue.js 的 UI 组件库,主要服务于 PC 界面的中后台产品. 项目地 ...
- 使用xargs同步文本中单词出现个数
#!/bin/bash # 分析一个文本文件中单词出现的频率. # 使用 'xargs' 将文本行分解为单词. # 检查命令行上输入的文件. ARGS= E_BADARGS= E_NOFILE= if ...