• 状态模式


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

    状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。当然,如果这个状态判断很简单,那就没必要用“状态模式”了。

    状态模式的好处是将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。

    将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个状态类中,所以通过定义新的子类可以很容易地增加新的状态和转换。

    消除庞大的条件分支语句,大的分支判断会使得它们难以修改和扩展。状态模式通过把各种状态转移逻辑分布到State的子类之间,来减少相互间依赖。

    当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。

     Work.java类

    package state;
    /**
     * 工作
     * @author 煞笔
     *
     */
    public class Work {
        private State current;
        private double hour;
        private boolean finish = false;//是否下班依据
        
        public Work() {//工作初始化为上午状态
            System.out.println("---------new ForenoonState()--------");
            current = new ForenoonState();
        }
        public void setState(State s){//设置撞他
            current = s;
        }
        public void writeProgram(){//写程序任务
            current.writeProgram(this);
        }
        
        public double getHour() {
            return hour;
        }
    
        public void setHour(double hour) {
            this.hour = hour;
        }
    
        public boolean isFinish() {
            return finish;
        }
    
        public void setFinish(boolean finish) {
            this.finish = finish;
        }
        
    }

    State类

    package state;
    /**
     * 抽象状态
     * @author 煞笔
     *
     */
    public abstract class State {
        /**
         * 写程序任务
         * @param w
         */
        public abstract void writeProgram(Work w);
    }

    ForenoonState类

    package state;
    
    public class ForenoonState extends State {
    
        @Override
        public void writeProgram(Work w) {
            //上午工作状态
            if(w.getHour()<12){
                System.out.println("当前时间:"+w.getHour()+" 点,上午工作,精神百倍");
            }else{//转中午工作状态
                System.out.println("---------next:new NoonState()--------");
                w.setState(new NoonState());
                w.writeProgram();
            }
        }
    
    }

    NoonState类

    package state;
    
    public class NoonState extends State {
        @Override
        public void writeProgram(Work w) {
            //中午工作状态
            if(w.getHour()<13){
                System.out.println("当前时间:"+w.getHour()+" 点,午饭:犯困,午休.");
            }else{//转下午工作状态
                System.out.println("---------next:new AfternoonState()--------");
                w.setState(new AfternoonState());
                w.writeProgram();
            }
        }
    }

    AfternoonState类

    package state;
    
    public class AfternoonState extends State {
        @Override
        public void writeProgram(Work w) {
            //下午工作状态
            if(w.getHour()<17){
                System.out.println("当前时间:"+w.getHour()+" 点,下午状态还不错,继续努力.");
            }else{//转傍晚工作状态
                System.out.println("---------next:new EveningState()--------");
                w.setState(new EveningState());
                w.writeProgram();
            }
        }
    }

    EveningState类

    package state;
    
    public class EveningState extends State {
        @Override
        public void writeProgram(Work w) {
            //是否下班
            if(w.isFinish()){
                System.out.println("---------next:new RestState()--------");
                w.setState(new RestState());
                w.writeProgram();
            }else{//转入晚间工作状态
                if(w.getHour()<21){//转入加班状态
                    System.out.println("当前时间:"+w.getHour()+" 点,加班哦,疲累之极.");
                }else{//转入睡眠状态
                    System.out.println("---------next:new SleepingState()--------");
                    w.setState(new SleepingState());
                    w.writeProgram();
                }
            }
        }
    }

    RestState类

    package state;
    
    public class RestState extends State {
    
        @Override
        public void writeProgram(Work w) {
            System.out.println("当前时间:"+w.getHour()+" 点,下班回家了.");
        }
    
    }

    SleepingState类

    package state;
    
    public class SleepingState extends State {
    
        @Override
        public void writeProgram(Work w) {//睡眠状态
            System.out.println("当前时间:"+w.getHour()+" 点,不行了,睡着了。");
        }
    
    }

    Business类

    package state;
    
    public class Business {
    
        public static void main(String[] args) {
            Work w = new Work();
            w.setHour(9);
            w.writeProgram();
            w.setHour(10);
            w.writeProgram();
            w.setHour(12);
            w.writeProgram();
            w.setHour(13);
            w.writeProgram();
            w.setHour(14);
            w.writeProgram();
            w.setHour(17);
            //w.setFinish(true);
            w.writeProgram();
            w.setHour(19);
            w.writeProgram();
            w.setHour(22);
            w.writeProgram();
        }
    
    }
  • 相关阅读:
    消费者端调用服务者端的接口,服务端抛出一个自定义异常,该异常继承了RuntimeException,但是消费者端Debug发现catch到的是RpcException,RpcExcetion为dubbo的异常,为什么服务提供者的返回的是自定义异常却变成了RpcException?
    springcloud使用常见总是总结
    mysql启动时报 --initialize specified but the data directory has files in it. Aborting.
    简介
    继承&&聚合
    maven常见命令&&依赖&&maven生命周期
    下载配置Maven&&使用maven
    Maven [ERROR] 不再支持源选项 5。请使用 6 或更高版本
    解决Maven下载速度缓慢问题
    配置和使用Maven
  • 原文地址:https://www.cnblogs.com/ccgjava/p/7106687.html
Copyright © 2020-2023  润新知