• 【设计模式】10.状态模式


    状态模式

      状态模式(State),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。当控制一个对象状态转换的条件表达式过于复杂时的情况,把条件判断转移到表示不同状态的一系列类中,把复杂的判断逻辑简化。

    结构图:

    业务中若条件判断很多,例如:

    public class Test {
    
        public static void main(String[] args) {
    
            int hour = 14;
    
            if(hour>=0 && hour<6){
    
                System.out.println("目前是凌晨状态");
    
            } else if(hour<=12){
    
                System.out.println("目前是上午状态");
    
            }else if(hour<=18){
    
                System.out.println("目前是下午状态");
    
            }else if(hour<=24){
    
                System.out.println("目前是夜晚状态");
    
            }else{
    
                System.out.println("时间越界!");
    
            }
    
        }
    
    }

    如果具体业务中每个条件判断内是非常复杂的逻辑,这段代码就会特别长,会产生代码坏味道(Long Method)。此时可以采用状态模式解决。

    例:

    public interface State {
        void handle(Context context);
    }
    public class ConcreteState1 implements State {
        @Override
        public void handle(Context context) {
            if(context.getHour()>=0 && context.getHour()<=6){ // 0~6点是凌晨状态
                System.out.println("目前是凌晨状态");
            }
            else{                           // 否则进入上午状态
                context.setState(new ConcreteState2());
                context.request();
            }
    
        }
    }
    public class ConcreteState2 implements State {
        @Override
        public void handle(Context context) {
            if(context.getHour()<=12){       // 6~12点前是上午状态
                System.out.println("目前是上午状态");
            }
            else{                           // 否则进入下午状态
                context.setState(new ConcreteState3());
                context.request();
            }
    
        }
    }
    public class ConcreteState3 implements State {
        @Override
        public void handle(Context context) {
            if(context.getHour()<=18){        // 12~18点前是下午状态
                System.out.println("目前是下午状态");
            }                                // 否则进入夜晚状态
            else{
                context.setState(new ConcreteState4());
                context.request();
            }
    
        }
    }
    public class ConcreteState4 implements State {
        @Override
        public void handle(Context context) {
            if(context.getHour()<=24){        // 18~24点前是夜晚状态
                System.out.println("目前是夜晚状态");
            }
            else{
                System.out.println("时间越界!");
            }
        }
    }
    public class Context {
        private State state;
        private int hour;
    
        public State getState() {
            return state;
        }
    
        public void setState(State state) {
            this.state = state;
        }
    
        public int getHour() {
            return hour;
        }
    
        public void setHour(int hour) {
            this.hour = hour;
        }
    
        public void request(){
            state.handle(this);
        }
    }
    public class Test {
        public static void main(String[] args) {
            Context context = new Context();
            context.setState(new ConcreteState1());  // 初始状态为状态1
            context.setHour(14);
            context.request();
        }
    }

    输出:

    目前是上午状态
  • 相关阅读:
    Android实战项目——家庭记账本(六)
    Android实战项目——家庭记账本(五)
    周总结(十五)
    Android实战项目——家庭记账本(四)
    Auto-Encoder(自编码器)原理
    Android实战项目——家庭记账本(三)
    Android实战项目——家庭记账本(二)
    Android实战项目——家庭记账本(一)
    Android实战项目——家庭记账本设计思路
    防止或减少过拟合的方式(二)——Dropout
  • 原文地址:https://www.cnblogs.com/jiazhongxin/p/12832033.html
Copyright © 2020-2023  润新知