• StatePattern(状态模式)


    /**
     * 状态模式
     * @author TMAC-J
     * 状态模式和策略模式很像,其实仔细研究发现完全不一样
     * 策略模式各策略之间没有任何关系,独立的
     * 状态模式各状态之间接口方法都是一样的
     * 另外一个区别是状态模式主要用于状态经常发生改变的情况
     * 策略模式发生在不改变的情况,策略模式一般在CONTEXT初始化时就决定了,并且中途不会改变
     * 换句话说,策略模式只是在对象初始化的时候更改执行模式,而状态模式是根据对象实例的周期时间而动态地改变对象实例的执行模式。
     * 状态模式的方法都是固定的,策略模式有不同的策略,可以随意些不同方法
     * key:策略模式是可以扩展不同的策略算法,而状态模式是以继承代替if-else,可以扩展不同
     * 情况,他能做的事情是固定不变的!
     * if-else特别多的时候用这种方式
     */
    public class StatePattern {
        /**
         * 这个接口负责定义所有的方法
         * 功能在这个接口加
         */
        interface State{
            void preChannel();
            void nextChannel();
            void turnon();
            void turndown();
        }
        
        public class PoweronState implements State{
            
            @Override
            public void preChannel() {
                System.out.println("pre");
            }
    
            @Override
            public void nextChannel() {
                System.out.println("next");
            }
    
            @Override
            public void turnon() {
                System.out.println("turnon");
            }
    
            @Override
            public void turndown() {
                System.out.println("turnoff");
            }
            
        }
    
        public class PoweroffState implements State{
            /**
             * 关机状态不做任何操作
             */
            @Override
            public void preChannel() {
                // TODO Auto-generated method stub
                
            }
            
            @Override
            public void nextChannel() {
                // TODO Auto-generated method stub
                
            }
            
            @Override
            public void turnon() {
                // TODO Auto-generated method stub
                
            }
            
            @Override
            public void turndown() {
                // TODO Auto-generated method stub
                
            }
            
        }
        /**
         * 这个接口负责定义不同状态
         * 状态在这个接口加
         */
        interface PowerController{
            
            void poweron();
            
            void poweroff();
            
        }
        /**
         * 需要写明不同的方法和不同的状态
         *
         */
        public class TVController implements PowerController{
    
            private State state;
            
            public void setState(State state){
                this.state = state;
            }
            
            @Override
            public void poweron() {
                setState(new PoweronState());
            }
    
            @Override
            public void poweroff() {
                setState(new PoweroffState());
            }
            
            public void preChannel() {
                state.preChannel();
            }
            
            public void nextChannel() {
                state.nextChannel();
            }
            
            public void turnon() {
                state.turnon();
            }
            
            public void turndown() {
                state.turndown();
            }
        }
        
        public class Client{
            public void test(){
                TVController tvController = new TVController();//这个时候只需要创建这个控制类就够啦
                tvController.setState(new PoweronState());//传递状态,相当于if
                /**
                 * 下面这四个直接写就可以了,不用管什么状态了,是不是很爽,到时候如果有不同的状态加入的话
                 * 只需要在控制器接口中添加相应的方法,或者是在写一个接口让控制器实现就可以啦
                 * 其他的都不用管!!!
                 */
                tvController.preChannel();
                tvController.nextChannel();
                tvController.turnon();
                tvController.turndown();;
            }
        }
        
    }
  • 相关阅读:
    Linux指令集
    [日记]贝鲁特煎熬第32天
    2019南京区域赛ABCHJK题解 & KMbfs(O(n^3))板子
    欧拉筛质数以及四大积性数论函数(欧拉函数、莫比乌斯函数、约数个数函数、约数和函数)
    简短的自我介绍
    BSTTreap名次树数组&指针实现板子 Ver1.0
    2019银川区域赛BDFGHIKN题解
    安装vs2010
    SPEmailEventReceiver 之导入附件EXCEL
    为incoming mail绑定事件,SPEmailEventReceiver
  • 原文地址:https://www.cnblogs.com/yzjT-mac/p/6234583.html
Copyright © 2020-2023  润新知