状态模式

设计模式----状态模式UML和实现代码

隐身守侯 提交于 2020-04-10 10:10:44
一、什么是状态模式? 状态模式(State)定义: 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。 状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。 类型:形为型模式 顺口溜:中访策备迭 观 模命 状 职解 二、 状态 模式UML 三、JAVA代码实现 package com.amosli.dp.behavior.state; public abstract class State { public abstract void handle(Context context); } package com.amosli.dp.behavior.state; public class Context { private State state; public State getState() { return state; } public void setState(State state) { this.state = state; } public Context(State state) { this.state = state; } public void request() { state.handle(this); } } package com

设计模式--状态模式

拥有回忆 提交于 2020-04-10 10:09:03
状态模式(state): 当对象的状态改变时,同时改变其行为。 QQ状态模式的特点: 1. 可以通过改变状态获得不同的行为。 2. 你的好友能同时看到你的变化。 示例: 状态模式测试类StateTest.java /** * 状态模式测试类 * * @author Kevin * @date 2016-3-16 */ public class StateTest { public static void main(String[] args) { State state = new State(); QQContext qqContext = new QQContext(state); /* 上线 */ state.setValue("online"); qqContext.switchStatus(); /* 下线 */ state.setValue("offline"); qqContext.switchStatus(); } } QQ状态模式的切换类QQContext.java /** * QQ状态模式的切换类 * * @author Kevin * @date 2016-3-16 */ public class QQContext { /* 上线状态 */ private static final String ONLINE = "online"; /* 离线状态 */

设计模式-状态模式

怎甘沉沦 提交于 2020-04-07 09:57:50
状态模式的特点是,对于有状态的对象,我们可以把复杂的“判断逻辑”提取到不同的状态对象中,允许内置的状态对象改变时影响它的行为。状态模式可以有效的减少if else 的分支结构;它将状态和行为绑定到一起,根据不同的状态来确定其行为。这样做的好处是将不同的状态引入独立的对象中会使得状态转换变得更加明确,且减少对象间的相互依赖。但是状态模式的结构与实现都较为复杂,如果使用不当会导致程序结构和代码的混乱。 模式结构 上下文(context):状态运行的环境 抽象状态(State)角色:对状态类型的抽象 具体状态(Concrete State)角色:状态类型的实现 源码导读 在复杂的业务场景中,我们一般使用状态机来实现状态的切换。状态机便是基于状态模式的思想设计。下面我们介绍spring组件中的状态机组件 spring statemachine 有限状态机。使用状态机可以让我们更加舒服而优雅的使用状态模式。 这里举例一个状态机适用场景——订单的支付到审核: 新建一个 spring boot 工程,添加依赖: <dependency> <groupId>org.springframework.statemachine</groupId> <artifactId>spring-statemachine-core</artifactId> </dependency> 定义状态枚举值和事件枚举值:

状态模式(State Pattern)

左心房为你撑大大i 提交于 2020-03-26 12:49:53
在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。 介绍 意图: 允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。 主要解决: 对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。 何时使用: 代码中包含大量与对象状态有关的条件语句。 如何解决: 将各种具体的状态类抽象出来。 关键代码: 通常命令模式的接口中只有一个方法。而状态模式的接口中有一个或者多个方法。而且,状态模式的实现类的方法,一般返回值,或者是改变实例变量的值。也就是说,状态模式一般和对象的状态有关。实现类的方法有不同的功能,覆盖接口中的方法。状态模式和命令模式一样,也可以用于消除 if...else 等条件选择语句。 应用实例: 1、打篮球的时候运动员可以有正常状态、不正常状态和超常状态。 2、曾侯乙编钟中,'钟是抽象接口','钟A'等是具体状态,'曾侯乙编钟'是具体环境(Context)。 优点: 1、封装了转换规则。 2、枚举可能的状态,在枚举状态之前需要确定状态种类。 3、将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。 4

设计模式之状态模式

让人想犯罪 __ 提交于 2020-03-23 17:27:16
3 月,跳不动了?>>> 定义 当一个对象的内部状态改变时允许改变其行为,这个对象看起来像是改变了其类。 由定义里可以看出,状态的改变是为了改变对象的行为,所以我们的思路就是将行为封装到对象中,然后利用多态机制来控制行为。 角色 状态模式有三个角色: Context 角色: 负责保存所有的状态,然后提供对外的使用接口 抽象状态角色:可以是接口,也可以是抽象类,定义了状态可以进行的操作,也就是定义中的行为 具体状态角色:具体实现每个状态的行为 模式说明 以现实中的订单状态为例,在还是新人的时候订单的状态转换是用一堆的if else 来判断和实现的,印象里面由于状态越加越多,在判断一个订单是否能退款、退货时,判断条件已经达到几层嵌套。 后来交接给同事了,不知道有没有对此进行重构。现在想来,要想解决这个问题,状态模式是一个比较好的方法。 我们演示程序中订单状态只有未创建,已创建,已付款和已退款三个状态,具有订单状态的是订单详情对象,因此订单详情对象就是我们的 Context 角色。 首先来定义状态接口, 它具有三个方法,这些方法指定了状态之间可以进行的转换。 public interface OrderState { void create(OrderDetail detail) throws UnsupportedOperationException; void pay

状态模式

左心房为你撑大大i 提交于 2020-03-21 18:22:48
最近发现项目中的判断太多,大量的if-else结构,想着重构下,于是接触到了状态模式。 这种设计模式就是java多态的体现,没有想象的那么神奇。 状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。 即 1、有一个对象,它是有状态的。 2、这个对象在状态不同的时候,行为不一样。 3、这些状态是可以切换的,而非毫无关系。 图中包含三个角色。 Context:它就是那个含有状态的对象,它可以处理一些请求,这些请求最终产生的响应会与状态相关。 State:状态接口,它定义了每一个状态的行为集合,这些行为会在Context中得以使用。 ConcreteState:具体状态,实现相关行为的具体状态类。 其他解释 环境(Context)角色,也成上下文:定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。这个具体状态类的实例给出此环境对象的现有状态。 抽象状态(State)角色:定义一个接口,用以封装环境(Context)对象的一个特定的状态所对应的行为。 具体状态(ConcreteState)角色:每一个具体状态类都实现了环境(Context)的一个状态所对应的行为。 个人还是喜欢把环境角色context带入接口的方法参数中,这样逻辑更清楚; 另外的方式是把context放入各个具体状态角色的构造方法中,当实例化context的时候

设计模式在美团外卖营销业务中的实践

房东的猫 提交于 2020-03-20 16:02:08
3 月,跳不动了?>>> 一、前言 随着美团外卖业务的不断迭代与发展,外卖用户数量也在高速地增长。在这个过程中,外卖营销发挥了“中流砥柱”的作用,因为用户的快速增长离不开高效的营销策略。而由于市场环境和业务环境的多变,营销策略往往是复杂多变的,营销技术团队作为营销业务的支持部门,就需要快速高效地响应营销策略变更带来的需求变动。因此,设计并实现易于扩展和维护的营销系统,是美团外卖营销技术团队不懈追求的目标和必修的基本功。 本文通过自顶向下的方式,来介绍设计模式如何帮助我们构建一套易扩展、易维护的营销系统。本文会首先介绍设计模式与领域驱动设计(Domain-Driven Design,以下简称为DDD)之间的关系,然后再阐述外卖营销业务引入业务中用到的设计模式以及其具体实践案例。 二、设计模式与领域驱动设计 设计一个营销系统,我们通常的做法是采用自顶向下的方式来解构业务,为此我们引入了DDD。从战略层面上讲,DDD能够指导我们完成从问题空间到解决方案的剖析,将业务需求映射为领域上下文以及上下文间的映射关系。从战术层面上,DDD能够细化领域上下文,并形成有效的、细化的领域模型来指导工程实践。建立领域模型的一个关键意义在于,能够确保不断扩展和变化的需求在领域模型内不断地演进和发展,而不至于出现模型的腐化和领域逻辑的外溢。关于DDD的实践,大家可以参考此前美团技术团队推出的《

设计模式——状态机

若如初见. 提交于 2020-03-03 12:37:04
引入 最近在做商城项目,负责订单模块的开发,在浏览微信支付官方文档的时候,在统一下单API文档中提到了“状态机”的概念,由此联想到我们的代码实现可以应用这个模式。 概念 状态模式是一种行为模式,在不同的状态下有不同的行为。状态模式的行为是平行的,不可替换的,比如电梯状态可以分为开门状态,关门状态,运行中状态。状态模式把对象的行为包装在不同的状态对象里,对象的行为取决于它的状态,当一个对象内部状态改变时,行为也随之改变。 意义 状态机可以对业务状态进行梳理,使项目结构更加清晰,提高代码可读性,同时可以轻松应对不断增加的业务场景。 实现(订单主流程) 在实现方面,把业务拆解成【状态枚举、事件枚举、 状态机配置、 状态机监听器】四个核心部分。 在 状态枚举 中列出订单的所有状态; 在 事件枚举 中列出触发订单状态切换的行为; 在 状态机配置 中配置业务流程中的种种行为和行为发生时的原始状态到目标状态的切换,我喜欢把每一个配置的触发称为“ 部件启动 ”; 状态机监听器 负责监听状态机配置中的状态机部件启动,控制业务流程的走向。 业务流程 项目结构 States 状态枚举 public enum States { /** 待提交 */ PENDING_SUBMIT, /** 待支付 */ PENDING_PAYMENT, /** 已支付 */ ALREADY_PAID, /** 用户取消 *

设计模式--状态模式

送分小仙女□ 提交于 2020-03-03 00:56:45
一、状态模式解释 在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 角色: A:环境(Context)角色:也称为上下文,它定义了客户感兴趣的接口,维护一个当前状态,并将与状态相关的操作委托给当前状态对象来处理。 B:抽象状态(State)角色:定义一个接口,用以封装环境对象中的特定状态所对应的行为。 C:具体状态(Concrete State)角色:实现抽象状态所对应的行为。 二、模式例子 主要演示发一张借记卡的状态变化。 A:环境(Context)角色: 1 package comm.pattern.action.state; 2 3 /** 4 * 5 * @Title: Context.java 6 * @Package: comm.pattern.action.state 7 * @Description: 上下文类 8 * @author yangzhancheng 9 * @2020年3月3日:上午12:17:02 10 * 11 */ 12 public class Context { 13 14 private ICardState cardState; 15 16 public void setCardState(ICardState cardState) { 17 this.cardState =

【C#设计模式-状态模式】示例1

爱⌒轻易说出口 提交于 2020-03-01 12:55:02
一.状态模式的定义:状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。 二.状态模式的意图:允许一个对象在其内部状态改变时改变它的行为。 三.状态模式的适用场景: 1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。 2.一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。 四.状态模式的实现: /// <summary> /// 定义接口,封装Context对象在特定状态下的行为 /// </summary> public abstract class AbstractState { public abstract void handle(Context context); } /// <summary> /// 具体A状态下的对于的行为 /// </summary> public class ConcreteStateA:AbstractState { public override void handle(Context context) { Console.WriteLine("当前状态:{0}",this.GetType().ToString()); //改变状态 context.State = new ContextStateB(); } } /