【设计模式】状态模式

类图

在这里插入图片描述

工程目录

在这里插入图片描述

代码

AbstractState.java

package com.company.pattern.demo12;

/**
 * 抽象状态类: 定义一个接口以封装与Context的一个特定状态相关的行为
 * @author blazar
 */
public abstract class AbstractState {
    /**
     * 用来描述与状态相关的行为
     * @param context
     */
    public abstract void handle(Context context);
}

Context.java

package com.company.pattern.demo12;

/**
 * 维护一个ConcreteState子类的实例
 * @author blazar
 */
public class Context {
    private AbstractState abstractState;

    public Context(AbstractState abstractState){
        this.abstractState = abstractState;
    }

    public AbstractState getAbstractState() {
        return abstractState;
    }

    public void setAbstractState(AbstractState abstractState) {
        this.abstractState = abstractState;
        System.out.println("当前状态:"+ this.abstractState.getClass().getName());
    }

    public void request(){
        abstractState.handle(this);
    }
}

ConcreteStateA.java

package com.company.pattern.demo12;

/**
 * 具体状态A
 * @author blazar
 */
public class ConcreteStateA extends AbstractState{
    @Override
    public void handle(Context context) {
        // 设置A的下一个状态是B
        context.setAbstractState(new ConcreteStateB());
    }
}

ConcreteStateB.java

package com.company.pattern.demo12;

/**
 * 具体状态B
 * @author blazar
 */
public class ConcreteStateB extends AbstractState{
    @Override
    public void handle(Context context) {
        // 设置B的下一个状态是A
        context.setAbstractState(new ConcreteStateA());
    }
}

测试类 Main.java

package com.company.pattern.demo12;

/**
 * 测试类
 * @author blazar
 */
public class Main {
    public static void main(String[] args) {
        Context context = new Context(new ConcreteStateA());

        context.request();
        context.request();
        context.request();
        context.request();
    }
}

在这里插入图片描述

使用场景

  1. 状态模式是为了解决if…else分支太复杂的问题,所以,如果判断逻辑太复杂,可以考虑使用状态模式;
  2. 使用状态模式可以让一个对象在它的内在状态变化时,改变其行为;

注意

AbstractState.java和Context.java有相互关联,相互依赖是不被允许的,但是相互关联则可以;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值