zoukankan      html  css  js  c++  java
  • 大话设计模式之状态模式

    状态模式

      允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。状态模式是一种对象行为型模式。

    涉及到的角色描述

      (1)Context类,定义客户端所感兴趣的接口,并且内部维护一个具体状态类的实例,从而维护了对象的现有状态。

      (2)State:抽象状态类或状态接口,用以抽象封装行为。

      (3)ConcreteState类:具体状态类,实现了State中的抽象方法。

    使用场景描述

      (1)对象的行为依赖于它的状态,并且可以在运行时根据状态改变行为。

      (2)代码中包含大量与对象状态有关的if/else语句,这些条件对应于对象的各种状态,这些冗余条件语句的出现导致代码的可维护性和灵活性变差,这种情况适合使用状态模式进行优化

    优点

      在不同状态需要有不同响应的使用场景下,避免了使用if/else导致代码臃肿,使代码结构清晰的同时保证了拓展性和维护性。

    缺点

      状态模式的使用必然会增加类和对象的个数,如果使用不当将导致程序结构和代码的混乱。

    具体代码示例

      state接口

    package com.chenpt.designModel.stateModel;
    
    /**
     * @Author: chen
     * @Description:
     * @Date: created in 2018/8/31
     * @Modified By:
     */
    public interface State {
        void doAction(Context context);
    }
    

      具体对象content

    package com.chenpt.designModel.stateModel;
    
    /**
     * @Author: chen
     * @Description:
     * @Date: created in 2018/8/31
     * @Modified By:
     */
    public class Context {
        private State state;
    
        Context(){
            this.state=null;
        }
    
        public State getState() {
            return state;
        }
    
        public void setState(State state) {
            this.state = state;
        }
    }
    

      状态A

    package com.chenpt.designModel.stateModel;
    
    /**
     * @Author: chen
     * @Description:
     * @Date: created in 2018/8/31
     * @Modified By:
     */
    public class StateA implements State {
        @Override
        public void doAction(Context context) {
            context.setState(this);
        }
    
        public String toString(){
            return "this is stateA";
        }
    }
    

      状态B

    package com.chenpt.designModel.stateModel;
    
    /**
     * @Author: chen
     * @Description:
     * @Date: created in 2018/8/31
     * @Modified By:
     */
    public class StateB implements State {
        @Override
        public void doAction(Context context) {
            context.setState(this);
        }
    
        public String toString(){
            return "this is stateB";
        }
    }
    

      客户端

    package com.chenpt.designModel.stateModel;
    
    /**
     * @Author: chen
     * @Description:
     * @Date: created in 2018/8/31
     * @Modified By:
     */
    public class MainTest {
    
        public static void main(String[] args){
            Context context = new Context();
            StateA stateA = new StateA();
            StateB stateB = new StateB();
    
            context.setState(stateA);
            System.out.println(context.getState());
    
            context.setState(stateB);
            System.out.println(context.getState());
        }
    
    }
    //执行结果
    this is stateA
    this is stateB
    

      

  • 相关阅读:
    训练集(Train),验证集(Validation)和测试集(Test Sets)以及交叉验证法
    看完了这篇实时数仓建设,才发现以前的都白看了(内有美团案例)
    PA模块常用表
    Workflow相关表简单分析
    总账balance表
    工作流转发功能实现
    iOS 使用AVAudioPlayer开发录音功能
    利用HTP工具包开发报表
    关于会话、进程、请求的几个常用SQL
    一些常用到的键弹性域和存其代码组合的表
  • 原文地址:https://www.cnblogs.com/chenpt/p/9580313.html
Copyright © 2011-2022 走看看