设计模式-状态模式(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) 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式是一种行为型模式. 结构
随机推荐
- wxWidgets开始编程
开始学习wxWidgets.上一页写"安装wxWidgets两遇到的障碍"(缩写"前言"). 先推荐一下这两天找到的学习材料. 博客中有一个系列教程,貌似作者没 ...
- RGB565与RGB555标志识别位图文件格式
近日从本地16比特位图读出象素彩色数据,并填充ANDROID的BITMAP数据.发现,使用CAVAS当屏幕显示,照片显示的颜色不正确,找了很多资料,原来发现两个原因: 1.将位图的颜色分量掩码弄错了, ...
- WPF实用指南二:移除窗体的图标
原文:WPF实用指南二:移除窗体的图标 WPF没有提供任何功能来移除窗体上的icon图标.一般的做法是设置一个空白的图标,如下图1: 这种做法在窗体边框与标题之间仍然会保留一片空白. 比较好的做法是使 ...
- DevOps技术路线图
来自roadmap.sh github地址 自己整理的百度脑图中文版
- AR研究-Demo集
原文:AR研究-Demo集 之前研究了图像处理.图像识别及AR 等相关技术,下载了很多开源源码进行学习和尝试引用,包括c++.c#.Opengl.Emgu. Aforge.OpenCV. ...
- 请求通道在等待 00:00:58.9616639 以后答复时超时。增加传递给请求调用的超时值,或者增加绑定上的 SendTimeout 值。分配给此操作的时间可能是更长超时的一部分。
异常信息:请求通道在等待 00:00:58.9616639 以后答复时超时.增加传递给请求调用的超时值,或者增加绑定上的 SendTimeout 值.分配给此操作的时间可能是更长超时的一部分. 开发背 ...
- C# Encoding.GetEncoding 编码列表
原文:C# Encoding.GetEncoding 编码列表 代码页 名称 显示名称 37 IBM037 IBM EBCDIC(美国 - 加拿大) 437 IBM437 OEM 美国 500 IBM ...
- ef调用 access
<add name="AccessConnection" connectionString="Provider=Microsoft.ACE.OleDb.12.0;D ...
- JS浏览器滚轮事件实现横向滚动照片展
if(window.attachEvent){ ///*IE8注册事件*/ this.oc.attachEvent('onmousewheel',function(e) { //函数体 }); } e ...
- 我怎么忽略了身份框架魔法,只是使用OWIN验证的中间件,以获得要求我寻求什么呢?
该OWIN中间件的东西第三方登录集成到您的ASP.NET应用程序是非常酷的,但我似乎无法弄清楚如何就剜出来的新的ID,它取代了蹩脚的成员身份 API.我没有兴趣在坚持所产生的债权,并在英法为基础的数据 ...