• 状态模式【行为模式】


    状态模式

    Allow an object to alter its behavior when its internal state changes.
    The Object will appear to change its class.
    允许对象在其内部状态改变时改变其行为。
    这个对象看起来会改变他的类型。
    
    public class Status {
        /**
         * 状态模式:
         * Allow an object to alter its behavior when its internal state changes.
         * The Object will appear to change its class.
         * 允许对象在其内部状态改变时改变其行为。这个对象看起来会改变他的类型。
         */
        @Test
        public void all() {
            final StateMachine stateMachine = StateMachine.builder().build();
            stateMachine.open();
            stateMachine.close();
            stateMachine.close();
            stateMachine.runing();
            stateMachine.stop();
        }
    }
    
    /**
     * 1)状态机的所有有效状态,返回 true 表示允许切换
     */
    interface IStatus {
        boolean open();
    
        boolean runing();
    
        boolean close();
    
        boolean stop();
    }
    /**
     * 2)抽象状态实现类
     */
    abstract class AStaus implements IStatus {
    
        @Override
        public boolean open() {
            return false;
        }
    
        @Override
        public boolean runing() {
            return false;
        }
    
        @Override
        public boolean close() {
            return false;
        }
    
        @Override
        public boolean stop() {
            return false;
        }
    
    }
    
    /**
     * 3)具体状态实现:只能从一种状态切换到某些特定状态
     */
    @Builder
    @Slf4j
    class OpenStatus extends AStaus {
        @Override
        public boolean close() {
            log.info("状态从 Open => Close");
            return true;
        }
    }
    /**
     * 3)具体状态实现:只能从一种状态切换到某些特定状态
     */
    @Builder
    @Slf4j
    class CloseStatus extends AStaus {
    
        @Override
        public boolean open() {
            log.info("状态从 Close => Open");
            return true;
        }
    
        @Override
        public boolean runing() {
            log.info("状态从 Close => Runnig");
            return true;
        }
    
    }
    /**
     * 3)具体状态实现:只能从一种状态切换到某些特定状态
     */
    @Builder
    @Slf4j
    class RunningStatus extends AStaus {
        @Override
        public boolean stop() {
            log.info("状态从 Running => Close");
            return true;
        }
    }
    /**
     * 3)具体状态实现:只能从一种状态切换到某些特定状态
     */
    @Builder
    @Slf4j
    class StopStatus extends AStaus {
        @Override
        public boolean open() {
            log.info("状态从 Stop => Open");
            return true;
        }
    
        @Override
        public boolean runing() {
            log.info("状态从 Stop => Running");
            return true;
        }
    }
    /**
     * 4)状态机:内部维护着所有有效的状态
     */
    @Builder
    @Slf4j
    class StateMachine implements IStatus {
        private static final IStatus OPEN = OpenStatus.builder().build();
        private static final IStatus CLOSE = CloseStatus.builder().build();
        private static final IStatus RUNNING = RunningStatus.builder().build();
        private static final IStatus STOP = StopStatus.builder().build();
        @Default
        private IStatus current = STOP;
    
        @Override
        public boolean open() {
            if (current.open()) {
                current = OPEN;
                return true;
            } else {
                log.info("无效的操作");
                return false;
            }
        }
    
        @Override
        public boolean runing() {
            if (current.runing()) {
                current = RUNNING;
                return true;
            } else {
                log.info("无效的操作");
                return false;
            }
        }
    
        @Override
        public boolean close() {
            if (current.close()) {
                current = CLOSE;
                return true;
            } else {
                log.info("无效的操作");
                return false;
            }
        }
    
        @Override
        public boolean stop() {
            if (current.stop()) {
                current = STOP;
                return true;
            } else {
                log.info("无效的操作");
                return false;
            }
        }
    
    }
    
  • 相关阅读:
    C++中static_cast, dynamic_cast使用方法
    JavaScript中的Boolean 方法与Number方法
    參数预计:最大似然预计、贝叶斯预计与最大后验预计
    漫谈程序控制流
    怎样使用 RMAN 增量备份恢复 data guard log gap(日志断档)
    Unity3d修炼之路:GUIbutton简单使用,完毕对一个简单对象Cube的移动,旋转
    Python写自己主动化之邮件发送(匿名)
    LintCode
    缓存之 ACache
    Android Studio:Multiple dex files define Landroid/support/annotation/AnimRes
  • 原文地址:https://www.cnblogs.com/zhuxudong/p/10164784.html
Copyright © 2020-2023  润新知