设计模式-状态模式(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) 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式是一种行为型模式. 结构
随机推荐
- C# PrintDocument 打印表格
1.封装好的辅助类: using System; using System.Data; using System.Drawing; using System.Drawing.Printing; usi ...
- sdut 5-1 继承和派生
5-1 继承与派生 Time Limit: 1000MS Memory limit: 65536K 题目描写叙述 通过本题目的练习能够掌握继承与派生的概念.派生类的定义和用法.当中派生类构造函数的定义 ...
- Math.Round四舍五入说明
Math.Round默认采用的不是四舍五入法, 而是四舍六入的银行家算法, 如何找回四舍五入法? Math.Round默认采用的不是四舍五入法, 而是四舍六入的银行家算法, 也就是四舍六入五考虑,五 ...
- VS发布到IIS Express外网Debug(如微信开发)
主要效果是本机调试网站,将网站发布到某域名(如m16758r728.iok.la),可以进入VS断点,不必再用远程调试!!! 环境 VS2015windows 10操作系统花生壳(可以用其他内网穿透的 ...
- Wrapped的返回值取值
Bared Wrapped using Newtonsoft.Json; using Newtonsoft.Json.Linq; string str = JsonConvert.Serial ...
- Git 将子文件夹分离为一个新的库
前面的需求 公司Android的项目上,想要将一些module抽取出来,作为一个可以被其它项目上使用的. 所以使用了git submodule的方案. 为了将代码库中的一个文件夹分离后,作为一个单独的 ...
- UWP开发-获取设备唯一ID
EasClientDeviceInformation deviceInfo = new EasClientDeviceInformation(); this.showDeviceInfo.Items. ...
- Android零基础入门第79节:Intent 属性详解(上)
Android应用将会根据Intent来启动指定组件,至于到底启动哪个组件,则取决于Intent的各属性.本期将详细介绍Intent的各属性值,以及 Android如何根据不同属性值来启动相应的组件. ...
- Tensorflow初级篇
第二章 Tensorflow主要依赖两个工具:Protocol Buffer和Bazel Protocol. Protocol Buffer是一个结构数据序列化的的工具,在Tensorflow中大部分 ...
- 很幽默的讲解六种Socket IO模型 Delphi版本(自己Select查看,WM_SOCKET消息通知,WSAEventSelect自动收取,Overlapped I/O 事件通知模型,Overlapped I/O 完成例程模型,IOCP模型机器人)
很幽默的讲解六种Socket IO模型(转)本文简单介绍了当前Windows支持的各种Socket I/O模型,如果你发现其中存在什么错误请务必赐教. 一:select模型 二:WSAAsyncSel ...