行为型模式之状态模式

行为型模式之状态模式

1. 简介

状态模式(State Pattern)是指对有状态的对象,把复杂的判断逻辑提取到不同的状态对象中,允许状态对象在其内部状态发生变化时改变其行为。

什么是有状态的对象?

对象的某些属性与外部事件产生互动时会发生改变,从而使对象表现出不同的行为,这种影响对象行为的一个或者多个动态变化的属性称为状态,拥有状态属性的对象就是有状态对象。

2. 相关角色

  • Context- 上下文环境。负责维护一个当前状态,并将与状态相关的操作交给当前状态来处理。该类负责与客户端交互。简单来说, 该类就是有状态的对象。
  • State- 抽象状态,用来声明特定状态下所对应的行为方法。
  • ConcreteState- 具体状态对象,实现抽象状态所对应的行为。

3. 代码演示

情景描述:

当前我们模拟简单订单的状态扭转案例来演示状态模式。

默认下单之后才会产生订单,所以订单的初始状态为已下单(未付款)。

订单的状态列表(已下单、已付款、已发货、已签收)。

3.1 类图

3.2 代码
package com.inconspicuousy.pattern.state;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

// 订单,负责状态的扭转
@Getter
@Setter
class Order {

    private String name;
    private State state;

    public Order(String name) {
        this.name = name;
        // 订单的初始状态为已下单
        this.state = new OrderState(this);
    }

    // 根据当前订单的状态处理一些事情
    public void doSomething() {
        // 本质上就是调用state对象去处理当前状态下的事情
        System.out.println("当前订单的状态为: " + state.getName());
        state.handler();
    }
}

// 状态接口
@Getter
@AllArgsConstructor
abstract class State {
    // 状态也会维护一个订单,方面获取订单的其他属性来处理状态下的行为
    private final Order order;
    // 状态的名称
    private final String name;
    // 定义订单状态所应的行为
    public abstract void handler();
}

// 已下单
class OrderState extends State {
    private static final String NAME = "已下单";
    public OrderState(Order order) {
        super(order, NAME);
    }
    @Override
    public void handler() {
        System.out.println(getOrder().getName() + "已下单,提醒买家付款");
    }
}

// 已付款
class PaidState extends State {
    private static final String NAME = "已付款";
    public PaidState(Order order) {
        super(order, NAME);
    }
    @Override
    public void handler() {
        System.out.println(getOrder().getName() + "已付款,提醒卖家发货");
    }
}

/**
 * 状态模式-测试
 * @author peng.yi
 */
public class StateTest {
    public static void main(String[] args) {

        Order order = new Order("苹果笔记本");
        order.doSomething();

        //    买家付款
        System.out.println("买家收到系统通知,已付款");
        order.setState(new PaidState(order));
        order.doSomething();

    }
}
3.3 测试结果
当前订单的状态为: 已下单
苹果笔记本已下单,提醒买家付款
买家收到系统通知,已付款
当前订单的状态为: 已付款
苹果笔记本已付款,提醒卖家发货

Process finished with exit code 0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值