Java设计模式(十八)--状态模式

简介

状态模式能在一个对象的内部状态变化时改变其行为,使其看上去就像改变了自身所属的类一样。

抽象状态角色

public interface State {

    public void open(Context context);

    public void action(Context context);

    public void close(Context context);

}

定义状态角色在特定状态下的相关行为。

具体状态角色

public class OpenState implements State {

    @Override
    public void open(Context context) {
        System.out.println("open状态下不能重复执行open操作");
    }

    @Override
    public void action(Context context) {
        context.setState(new ActionState());
        System.out.println("执行action操作");
    }

    @Override
    public void close(Context context) {
        context.setState(new CloseState());
        System.out.println("执行close操作");
    }

}

public class ActionState implements State {

    @Override
    public void open(Context context) {
        System.out.println("action状态下不能执行open操作");
    }

    @Override
    public void action(Context context) {
        System.out.println("action状态下不能重复执行action操作");
    }

    @Override
    public void close(Context context) {
        context.setState(new CloseState());
        System.out.println("执行close操作");
    }

}

public class CloseState implements State {

    @Override
    public void open(Context context) {
        context.setState(new OpenState());
        System.out.println("执行open操作");
    }

    @Override
    public void action(Context context) {
        System.out.println("close状态不能执行action操作");
    }

    @Override
    public void close(Context context) {
        System.out.println("close状态不能重复执行close操作");
    }

}

每一个具体的状态角色类对应一个具体的状态,不同的状态角色类中的行为也不相同。

环境角色

public class Context {

    private State state = null;

    public State getState() {
        return state;
    }

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

    public Context(){
        // 默认close状态
        state = new CloseState();
    }

    public void open(){
        state.open(this);
    }

    public void action(){
        state.action(this);
    }

    public void close(){
        state.close(this);
    }
}

使用环境角色类来封装状态角色,并通过该类来调用不同状态下的各个行为方法。

测试

public class StateDemo {

    @Test
    public void stateTest(){
        Context context = new Context();

        context.open();
        context.action();
        context.close();
    }

}

总结

状态模式很好的解决了if else之类的代码,但是当状态的数量增加时,也会导致具体状态角色的类的数量随之增加。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值