设计模式--状态模式

Java工程源码

类图

这里写图片描述


定义
当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类


优点
- 结构清晰
- 遵循设计原则。很好的体现了开闭原则和单一职责原则
- 封装性非常好

缺点
- 子类会很多,每个状态都有一个子类


使用场景
- 行为随状态改变而改变的场景
- 条件,分支判断语句的替代者


注意事项
状态模式适用于当某个对象在它的状态发生改变时,它的行为随着发生比较大的变化,即行为受状态约束的情况下可以使用状态模式


抽象状态角色

public abstract class State {
    /**
     * 定义一个环境角色,提供子类访问
     */
    protected Context context;

    public Context getContext() {
        return context;
    }

    public void setContext(Context context) {
        this.context = context;
    }

    public abstract void handle1();

    public abstract void handle2();
}

具体状态角色1

public class ConcreteState1 extends State {

    @Override
    public void handle1() {
        // 改状态下必须处理的逻辑
        System.out.println("ConcreteState1->handle1()");
    }

    @Override
    public void handle2() {
        System.out.println("状态转换");
        // 设置当前状态为state2
        super.context.setCurrentState(Context.STATE2);
        // 过渡到state2状态,由Context实现
        super.context.handle2();
    }

    @Override
    public String toString() {
        return "状态1";
    }
}

具体状态角色2

public class ConcreteState2 extends State {
    @Override
    public void handle1() {
        System.out.println("状态转换");
        super.context.setCurrentState(Context.STATE1);
        super.context.handle1();
    }

    @Override
    public void handle2() {
        System.out.println("ConcreteState2->handle2()");
    }

    @Override
    public String toString() {
        return "状态2";
    }
}

具体环境角色

public class Context {
    public final static State STATE1 = new ConcreteState1();
    public final static State STATE2 = new ConcreteState2();
    /**
     * 当前状态
     */
    private State currentState;

    /**
     * 获取当前状态
     *
     * @return
     */
    public State getCurrentState() {
        return currentState;
    }

    /**
     * 定义状态
     *
     * @param currentState
     */
    public void setCurrentState(State currentState) {
        this.currentState = currentState;
        this.currentState.setContext(this);
    }

    /**
     * 行为委托
     */
    public void handle1() {
        this.currentState.handle1();
    }

    public void handle2() {
        this.currentState.handle2();
    }
}

场景类

public class Client {
    public static void main(String[] args) {
        //定义环境角色
        Context context = new Context();
        //初始化状态
        context.setCurrentState(new ConcreteState1());
        System.out.println("当前状态:"+context.getCurrentState());
        //行为委托
        context.handle1();
        System.out.println("当前状态:"+context.getCurrentState());
        context.handle2();
        System.out.println("当前状态:"+context.getCurrentState());
    }
}

运行结果

当前状态:状态1
ConcreteState1->handle1()
当前状态:状态1
状态转换
ConcreteState2->handle2()
当前状态:状态2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值