zoukankan      html  css  js  c++  java
  • 状态模式(State)_java实现

    //20210122
    写在前面:刚期末考试完,考了面向对象,里边儿有23个设计模式,我寻思着考完挨个儿实现一下,本文实现状态模式

    状态模式核心思想:

    • 符合迪米特原则,将大量分支语句变成类的形式

    程序源代码:

    • 此处实现一个电梯的状态转换
    //电梯状态抽象类
    public abstract class LiftState {
    
        protected Context context;
    
        public void setContext(Context context){
            this.context = context;
        }
    
        //电梯门开启动作
        public abstract void open();
        //电梯门关闭动作
        public abstract void close();
        //电梯运行
        public abstract void run();
        //电梯停止
        public abstract void stop();
    }
    
    //电梯门关闭状态
    public class ClosingState extends LiftState {
        @Override
        public void open() {
            //电梯门关了可以再开
            super.context.setLiftState(Context.OPENING_STATE);
            super.context.getLiftState().open();
    
        }
    
        @Override
        public void close() {
            System.out.println("电梯门关闭");
        }
    
        @Override
        public void run() {
            //关门可以运行
            super.context.setLiftState(Context.RUNNING_STATE);
            super.context.getLiftState().run();
        }
    
        @Override
        public void stop() {
            //关门但是没有按楼层
            super.context.setLiftState(Context.STOPPING_STATE);
            super.context.getLiftState().stop();
        }
    }
    
    
    //电梯门开启状态
    public class OpeningState extends LiftState {
        @Override
        public void open() {
            System.out.println("电梯门开启");
        }
    
        @Override
        public void close() {
            super.context.setLiftState(Context.CLOSING_STATE);
            super.context.getLiftState().close();
        }
    
        //门开着不能运行
        @Override
        public void run() {
            //什么都不做
            System.out.println("开门状态不能运行");
        }
    
        //门开着已经停止了
        @Override
        public void stop() {
            //什么都不做
            System.out.println("电梯处于停止状态");
        }
    }
    
    
    //电梯运行状态
    public class RunningState extends LiftState {
        @Override
        public void open() {
            //运行途中不可开门,故什么都不做
            System.out.println("运行途中不能开门");
    
        }
    
        @Override
        public void close() {
            //门已经是关着的
            System.out.println("门处于关闭状态,无法再关门");
        }
    
        @Override
        public void run() {
            System.out.println("电梯运行中……");
        }
    
        @Override
        public void stop() {
            //运行过程中可以停下
            super.context.setLiftState(Context.STOPPING_STATE);
            super.context.getLiftState().stop();
        }
    }
    
    
    //电梯停止状态
    public class StoppingState extends LiftState {
        @Override
        public void open() {
            //停下可以开门
            super.context.setLiftState(Context.OPENING_STATE);
            super.context.getLiftState().open();
    
        }
    
        @Override
        public void close() {
            //开门状态转为关门状态
            super.context.setLiftState(Context.CLOSING_STATE);
            super.context.getLiftState().close();
        }
    
        @Override
        public void run() {
            //停止状态的电梯可以运行
            super.context.setLiftState(Context.RUNNING_STATE);
            super.context.getLiftState().run();
        }
    
        @Override
        public void stop() {
            //运行过程中可以停下
            System.out.println("电梯已停止");
    
        }
    }
    
    
    //测试主类
    
    public class Main {
        public static void main(String[] args) {
            Context context = new Context();
    
            //定义初始状态为关门(共四种初始值)
            context.setLiftState(new RunningState());
            context.open();
            context.close();
            context.run();
            context.stop();
            context.run();
            context.stop();
            context.open();
            context.close();
        }
    }
    
    • 输出如下:

    以上
    希望对大家有所帮助

  • 相关阅读:
    20145326蔡馨熤《网络对抗》——MSF基础应用
    20145326蔡馨熤《计算机病毒》——静态分析(3)
    20145324王嘉澜《网络对抗技术》web安全基础实践
    20145324王嘉澜《网络对抗技术》Web基础
    20145324王嘉澜《网络对抗技术》网络欺诈技术防范
    20145324王嘉澜《网络对抗技术》 信息搜集与漏洞扫描
    20145324王嘉澜《网络对抗技术》MSF基础应用
    20145324王嘉澜《网络对抗技术》恶意代码分析
    20145324 王嘉澜《网络对抗技术》 免杀原理与实践
    20145324王嘉澜 《网络对抗技术》 后门原理与实践
  • 原文地址:https://www.cnblogs.com/lavender-pansy/p/14312399.html
Copyright © 2011-2022 走看看