12、状态模式—去除状态判断代码

状态模式(State):当一个对象的内在状态改变时允许改变其行为,这个对象看起来是改变其类。

UML图:

12、状态模式—去除状态判断代码_第1张图片


package com.thpin.repository.designpattern;

public class StateDemo {
    public static void main(String[] args) {
        String state = "stateA";
        if ("stateA".equals(state)) {
            System.out.println("状态A 工作");
        } else if ("stateB".equals(state)) {
            System.out.println("状态B 工作");
        }
        /*
         * 根据需求变更,还会有更多的状态
         * 就会出现更多的if else
         * 违反了开闭原则,因为对修改开放了
         */
        
        // 而状态模式对保证了客户端的扩展开放,修改关闭
        Context context = new Context(new StateA());
        context.request();
        context.request();
        context.request();
        context.request();
    }
}

/*
 * 上下文
 */
class Context {
    private State state;

    public Context(State state) {
        this.state = state;
    }

    public void request() {
        state.handle(this);
    }
    
    public State getState() {
        return state;
    }

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

/*
 * 状态抽象类
 */
abstract class State  {
    public abstract void handle(Context context);
}

/*
 * 状态A
 */
class StateA extends State {
    public void handle(Context context) {
        System.out.println("状态A 工作");// 当前状态A的工作
        context.setState(new StateB());
    }
}

/*
 * 状态B
 */
class StateB extends State {
    public void handle(Context context) {
        System.out.println("状态B 工作");// 当前状态B的工作
        context.setState(new StateA());
    }
}

结果:

状态A 工作
状态A 工作
状态B 工作
状态A 工作

状态B 工作

状态模式主要解决的是控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把简单的判断逻辑简化。

你可能感兴趣的:(设计模式,状态模式,设计模式)