zoukankan      html  css  js  c++  java
  • 状态模式(设计模式_18)

    状态模式,例如在一个对象中,用了if/switch这种语句判断,而产生的(方法过长)时,如果以后扩展增加功能的话,就需要去改,if/switch这种语句里面的代码,这样的话就违背了开放封闭式原则, 所以在这种情况下就可以考虑状态模式, 如果判断很简单那就没有必要用状态模式了

    面向对象设计中希望做到责任分解

    以下就举例(案例),从传统方式,演变成状态模式的过程:


    传统方式完成:

    package com.oop.demo2;
    
    /**
     * 定义工作对象
     * @author Liudeli
     *
     */
    public class Work {
    
        /**
         * 定义工作之外的属性
         */
        private int hour;
        private boolean isComplete;
    
        public int getHour() {
            return hour;
        }
        public void setHour(int hour) {
            this.hour = hour;
        }
        public boolean isComplete() {
            return isComplete;
        }
        public void setComplete(boolean isComplete) {
            this.isComplete = isComplete;
        }
    
        /**
         * 做安卓项目开发工作
         */
        public void doAndroidProject() {
            // 上午九点钟开始上班
            if (hour < 12) {
                System.out.println(hour + "点钟,上午上班精力旺盛...");
            } else if(hour < 13) {
                System.out.println(hour + "点钟,中午饿了,该吃饭了...");
            } else if (hour <18) {
                System.out.println(hour + "点钟,下午犯困,效率降低了...");
            } else {
                if (isComplete) {
                    System.out.println(hour + "点钟,下班走人...");
                } else {
                    System.out.println(hour + "点钟,还在熬夜加班中...");
                }
            }
        }
    
    }
    
    package com.oop.demo2;
    
    /**
     * 测试程序(改进版本 分类)
     * @author Liudeli
     *
     */
    public class Main {
    
        public static void main(String[] args) {
            Work work = new Work();
    
            for (int i = 9; i < 24; i++) {
                try {
                    Thread.sleep(1200);
    
                    work.setHour(i);
                    work.doAndroidProject();
    
                    if (20 == i) {
                        work.setComplete(true);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
    }
    

    运行结果:
    这里写图片描述


    演变成状态模式:

    package com.oop.demo4;
    
    /**
     * 抽象出状态抽象类
     */
    public abstract class State {
    
        /**
         * 做C项目的工作
         * @param work
         */
        public abstract void doCProject(Work work);
    
    }
    
    package com.oop.demo4;
    
    /**
     * 定义上午状态具体对象
     * @author Liudeli
     *
     */
    public class ShanwuState extends State{
    
        public void doCProject(Work work) {
            int hour = work.getHour();
            if (hour < 12) {
                System.out.println(hour + "点钟,上午工作,精力旺盛...");
            } else {
                // 切入到中午状态具体对象
                work.setState(new ZhonwuState());
                // 工作
                work.doWork();
            }
        }
    
    }
    
    package com.oop.demo4;
    
    /**
     * 定义中午具体对象
     * @author Liudeli
     *
     */
    public class ZhonwuState extends State{
    
        public void doCProject(Work work) {
            int hour = work.getHour();
            if (hour < 13) {
                System.out.println(hour + "点钟,中午时间到了,该去吃饭了...");
            } else {
                // 切换到下午状态具体对象
                work.setState(new XiawuState());
                // 工作
                work.doWork();
            }
        }
    
    }
    
    package com.oop.demo4;
    
    /**
     * 定义下午具体对象
     * @author Liudeli
     *
     */
    public class XiawuState extends State{
    
        public void doCProject(Work work) {
            int hour = work.getHour();
            if (hour < 18) {
                System.out.println(hour + "点钟,下午犯困,工作效率降低...");
            } else {
                // 决定是下班状态
                work.setState(new ExitState());
                work.doWork();
            }
        }
    
    }
    
    package com.oop.demo4;
    
    /**
     * 定义加班具体对象
     * @author Liudeli
     *
     */
    public class JiabanState extends State{
    
        public void doCProject(Work work) {
            boolean exit = work.getExit();
            if (exit) {
                work.setState(new ExitState());
                work.doWork();
            } else {
                System.out.println(work.getHour() + "点钟,在无休止的加班熬夜中...");
            }
        }
    
    }
    
    package com.oop.demo4;
    
    /**
     * 下班离开状态具体对象
     * @author Liudeli
     *
     */
    public class ExitState extends State {
    
        public void doCProject(Work work) {
            boolean exit = work.getExit();
            System.out.println(exit);
            if (exit) {
                System.out.println(work.getHour() + "点钟,工作完成,已下班,准备下班中...");
            } else {
                work.setState(new JiabanState());
                work.doWork();
            }
        }
    
    }
    
    package com.oop.demo4;
    
    /**
     * 定义具体工作对象
     * @author Liudeli
     *
     */
    public class Work {
    
        /**
         * 定义抽象状态的抽象类
         */
        private State state;
    
        // 默认上午开始工作
        public Work() {
            this.state = new ShanwuState();
        }
    
        public void setState(State state) {
            this.state = state;
        }
    
        public State getState() {
            return state;
        }
    
        /**
         * 定义工作时间
         */
        public int hour;
    
        public void setHour(int hour) {
            this.hour = hour;
        }
    
        public int getHour() {
            return hour;
        }
    
        /**
         * 定义是否下班
         */
        private boolean isExit;
    
        public boolean  getExit() {
            return isExit;
        }
    
        public void setExit(boolean isExit) {
            this.isExit = isExit;
        }
    
        /**
         * 执行工作
         */
        public void doWork() {
            state.doCProject(this);
        }
    
    }
    
    /**
     * 测试程序(状态模式)
     * @author Liudeli
     *
     */
    public class Test {
    
        public static void main(String[] args) {
    
            Work work = new Work();
    
            for (int i = 9; i < 24; i++) {
                try {
                    Thread.sleep(1200);
    
                    work.setHour(i);
    
                    if (19 < i) {
                        work.setExit(true);
                    }
    
                    work.doWork();
    
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
    }

    运行结果:
    这里写图片描述


    谢谢大家的观看,更多精彩技术博客,会不断的更新,请大家访问,
    刘德利CSDN博客, http://blog.csdn.net/u011967006

  • 相关阅读:
    基于TMS320C6678、FPGA XC5VLX110T的6U CPCI 8路光纤信号处理卡
    KC705E 增强版 基于FMC接口的Xilinx Kintex7 FPGA K7 XC7K325T PCIeX8 接口卡
    基于Xilinx Kintex7 FPGA K7 XC7K325T PCIeX8 四路光纤卡
    IOS常用API
    数学和物理的公式
    [cocos2d]如何实现模态对话框
    使用加速器实现的定位算法
    cocos2d 粒子设计器
    陀螺仪操作摄相机,可以旋转,但角度(轴)还不对
    gluLookAt 的参数
  • 原文地址:https://www.cnblogs.com/android-deli/p/10322198.html
Copyright © 2011-2022 走看看