状态模式-State-订单状态

JAVA设计模式-状态模式-State-订单状态

21. State(状态)

意图:

允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

解释:

比如说对订单的提交,第一次提交是成功的,但是第二次提交的时候就会是失败的,因为其内部状态已经改变,而外部都是“订单”调用了“提交”方法,同一个行为,但是实质上造成的效果已经不同。

适用性:

一个对象的行为取决于它的状态, 并且它必须在运行时刻根据状态改变它的行为。

一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常, 有多个操作包含这一相同的条件结构。State模式将每一个条件分支放入一个独立的类中。这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。

解释:

行为取决于它的状态,即是说由状态决定行为,方法放在状态类中,而状态控制亦在状态类中进行,譬如一个按钮,按一次是开,按一次是关,同一个行为,但是由于其状态的改变,而导致不同的结果。

一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常, 有多个操作包含这一相同的条件结构。State模式将每一个条件分支放入一个独立的类中。这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。

即是说以前你需要在某个行为的方法里面用if/else或者switch中写的一堆业务,现在可以转移到状态类中了,而该状态类是独立的,非常便于流程管理。譬如之前的开关,你需要在toggle()中写if/else,并且需要返回flag以便判断状态,而使用状态类,将状态分为开/关两种状态,只需要在状态类的toggle()方法中写入逻辑,将行为后的状态返回即可。

实现:

需要实现这个逻辑:

那么我们就需要

3个具体状态类(已预订,已确认,已锁定)

以及3个行为(确认,修改,支付)

抽象状态类

[java] view plain copy

  1. abstract class OrderState {
  2. abstract void confirm(OrderContext orderContext);
  3. abstract void modify(OrderContext orderContext);
  4. abstract void pay(OrderContext orderContext);
  5. }

具体状态类

[java] view plain copy

  1. class OrderedState extends OrderState {
  2. @Override
  3. void confirm(OrderContext orderContext) {
  4. System.out.println("订单已确认");
  5. orderContext.setState(new ConfirmedState());
  6. }
  7. @Override
  8. void modify(OrderContext orderContext) {
  9. System.out.println("订单已修改");
  10. orderContext.setState(this);
  11. }
  12. @Override
  13. void pay(OrderContext orderContext) {
  14. System.out.println("预定状态无法完成订单!");
  15. }
  16. }
  17. class ConfirmedState extends OrderState {
  18. @Override
  19. void confirm(OrderContext orderContext) {
  20. System.out.println("订单已确认,请勿重复确认");
  21. }
  22. @Override
  23. void modify(OrderContext orderContext) {
  24. System.out.println("订单已修改,请再次确认");
  25. orderContext.setState(new OrderedState());
  26. }
  27. @Override
  28. void pay(OrderContext orderContext) {
  29. System.out.println("订单已支付,无法再修改");
  30. orderContext.setState(new LockedState());
  31. }
  32. }
  33. class LockedState extends OrderState {
  34. @Override
  35. void confirm(OrderContext orderContext) {
  36. System.out.println("订单已锁定");
  37. }
  38. @Override
  39. void modify(OrderContext orderContext) {
  40. System.out.println("订单已锁定");
  41. }
  42. @Override
  43. void pay(OrderContext orderContext) {
  44. System.out.println("订单已锁定");
  45. }
  46. }

背景类

[java] view plain copy

  1. class OrderContext {
  2. OrderState state = null;
  3. //新建订单设为已预定状态
  4. OrderContext() {
  5. this.state = new OrderedState();
  6. }
  7. void setState(OrderState state) {
  8. this.state = state;
  9. }
  10. public void confirm() {
  11. state.confirm(this);
  12. }
  13. public void modify() {
  14. state.modify(this);
  15. }
  16. public void pay() {
  17. state.pay(this);
  18. }
  19. }

测试:

[java] view plain copy

  1. public static void main(String[] args) {
  2. OrderContext orderContext = new OrderContext();
  3. orderContext.confirm();     //已预定状态>已确认状态
  4. orderContext.modify();      //已确认状态>已预定状态
  5. orderContext.confirm();    //已预定状态>已确认状态
  6. orderContext.pay();       //已确认状态>已锁定状态
  7. orderContext.modify();    //已锁定状态
  8. }

[java] view plain copy

  1. 订单已确认
  2. 订单已修改,请再次确认
  3. 订单已确认
  4. 订单已支付,无法再修改
  5. 订单已锁定
时间: 2024-10-12 10:22:38

状态模式-State-订单状态的相关文章

设计模式 - 状态模式(state pattern) 未使用状态模式 详解

状态模式(state pattern) 未使用状态模式 详解 本文地址: http://blog.csdn.net/caroline_wendy 状态模式可以控制状态的转换, 未使用设计模式时, 程序会非常繁杂. 具体方法: 1. 状态转换类. /** * @time 2014年7月11日 */ package state; /** * @author C.L.Wang * */ public class GumballMachine { final static int SOLD_OUT =

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

1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ellse语句来做状态判断来进行不同情况的处理.但是对复杂状态的判断就显得“力不从心了”.随着增加新的状态或者修改一个状体(if else(或switch case)语句的增多或者修改)可能会引起很大的修改,而程序的可读性,扩展性也会变得很弱.维护也会很麻烦.那么我就考虑只修改自身状态的模式. 例子1:按钮来控制一个电梯的状态,一个电梯开们,关门,停,

设计模式 - 状态模式(state pattern) 详解

状态模式(state pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy 状态模式(state pattern): 允许对象在内部状态改变时改变它的行为, 对象看起来好像修改了它的类. 建立Context类, 包含多个具体状态(concrete state)类的组合, 根据状态的不同调用具体的方法, state.handle(), 包含set\get方法改变状态. 状态接口(state interface), 包含抽象方法handle(),

设计模式之状态模式(State)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

状态模式 State

状态模式(State),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. Context中有成员变量标志其状态,在每次请求过后,在具体状态类中设置其变化至的类. // State.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> #include <string> using names

设计模式(行为型)之状态模式(State Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之模板方法模式(Template Method Pattern)>http://blog.csdn.net/yanbober/article/details/45501715 概述 状态模式用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题.当系统中

状态模式(State Pattern)

当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化. 上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的Concrete State对象来处理. 抽象状态(State):定义一个接口以封装使用上下文环境的的一个特定状态相关的行为. 具体状态(Concrete State

学习笔记——状态模式State

状态模式,主要是用于存在大量case判断的操作执行,同时这些case依赖于对象的状态,那么就可以将大量的case判断封装为独立的类. Context: -state,当前状态对象. ChangeState(state),切换state对象. OperationInterface(),调用State->OperationInterface. OperationChangeState(),调用State->OperationChangeState(Context). State: ChangeSt

行为型设计模式之状态模式(State)

结构 意图 允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类. 适用性 一个对象的行为取决于它的状态, 并且它必须在运行时刻根据状态改变它的行为. 一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态.这个状态通常用一个或多个枚举常量表示.通常, 有多个操作包含这一相同的条件结构.S t a t e模式将每一个条件分支放入一个独立的类中.这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化. 1 using Syste