• 状态模式(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();
        }
    }
    
    • 输出如下:

    以上
    希望对大家有所帮助

  • 相关阅读:
    CF981D
    CF883H
    Hdu 5884
    全排列
    二叉搜索树实现
    my.ini配置详解
    主元素问题
    排序算法(还需补充)
    迷宫问题(DFS,BFS)
    算法导论4--求最大和数组
  • 原文地址:https://www.cnblogs.com/lavender-pansy/p/14312399.html
Copyright © 2020-2023  润新知