【设计模式】行为型模式8——状态模式

状态模式

优点

  1. 封装转换规则
  2. 将一个状态相关的操作放在一个类中,Context只需要切换自己的状态就能做相应操作
  3. 取代if块
  4. 可以被多个Context共享一个State

缺点

  1. 不符合开闭原则
  2. 结构与实现复杂

使用场景

  1. 行为随状态改变而改变的场景
  2. 条件、分支语句的代替者
/**
 * 角色(Context)
 */
public class Factory {

    private State state;
    private HashMap<String, State> stateMap;
    private int inventory;

    public Factory() {
        stateMap = new HashMap<>();
        OrderState orderState = new OrderState();
        ProcessOrderState processOrderState = new ProcessOrderState();
        StopOrderState stopOrderState = new StopOrderState();

        stateMap.put(orderState.getName(), orderState);
        stateMap.put(processOrderState.getName(), processOrderState);
        stateMap.put(stopOrderState.getName(), stopOrderState);

        setInventory(3);
        setState(orderState);
    }

    public int getInventory() {
        return inventory;
    }

    public void setInventory(int inventory) {
        this.inventory = inventory;
    }

    public State getState(String name) {
        return stateMap.get(name);
    }

    public void setState(State state) {
        this.state = state;
    }

    public void handle(){
        this.state.handle(this);
        System.out.println("生产厂状态变更,目前为:" + this.state.getName());
    }
}

public abstract class State {

    protected String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public abstract void handle(Factory factory);
}


/**
 * 角色(ConcreteState)
 */
public class OrderState extends State{

    public OrderState() {
        this.setName("接受订单状态");
    }

    @Override
    public void handle(Factory factory) {
        System.out.println("正在接受订单......");
        if(factory.getInventory() == 0){
            System.out.println("暂无库存,目前不接受订单");
            factory.setState(factory.getState("不接受订单状态"));
        }else {
            factory.setInventory(factory.getInventory() - 1);
            factory.setState(factory.getState("订单处理状态"));
        }
    }
}


/**
 * 角色(ConcreteState)
 */
public class ProcessOrderState extends State{

    public ProcessOrderState() {
        this.setName("订单处理状态");
    }

    @Override
    public void handle(Factory factory) {
        System.out.println("订单处理中......");
        factory.setState(factory.getState("接受订单状态"));
        System.out.println("订单处理完成!!!剩余库存:" + factory.getInventory());
        if(factory.getInventory() <= 0){
            factory.setState(factory.getState("不接受订单状态"));
        }
    }
}


/**
 * 角色(ConcreteState)
 */
public class StopOrderState extends State{

    public StopOrderState() {
        this.setName("不接受订单状态");
    }

    @Override
    public void handle(Factory factory) {
        if(factory.getInventory() > 0){
            System.out.println("重新开始接受订单");
            factory.setState(factory.getState("接受订单状态"));
        }else {
            System.out.println("目前不接受订单,请谅解......");
        }
    }
}

测试类

public class Test {

    public static void main(String[] args) {

        Factory factory = new Factory();
        factory.handle();
        factory.handle();
        factory.handle();
        factory.handle();
        factory.handle();
        factory.handle();
        factory.handle();
        factory.handle();
        factory.handle();
        factory.setInventory(3);
        factory.handle();
        factory.handle();
        factory.handle();
    }
}

结果
状态模式结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值