zoukankan      html  css  js  c++  java
  • 【设计模式】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();
        }
    }

    输出:

    目前是上午状态
  • 相关阅读:
    mycat
    人大金仓备份和还原
    文件断点上传,html5实现前端,java实现服务器
    MoChat
    PHP性能追踪及分析工具xhprof的安装与使用
    使用 satis 搭建一个私有的 Composer 包仓库
    sed命令用法详解
    rsync同步工具学习笔记
    服务器支持AspJpeg和JMail45_free.msi组件
    批处理——服务器的web文件备份
  • 原文地址:https://www.cnblogs.com/jiazhongxin/p/12832033.html
Copyright © 2011-2022 走看看