zoukankan      html  css  js  c++  java
  • 状态模式

    模式介绍

    在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的Context对象。

    模式优点

    1、允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。
    2、将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。
    3、允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。
    4、可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数。

    模式缺点

    1、状态模式的使用必然会增加系统类和对象的个数。
    2、状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。
    3、状态模式对"开闭原则"的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态变化的源代码。

    使用场景

    1、行为随状态改变而改变的场景。
    2、条件、分支语句的代替者。

    系统建模

    1、创建一个State接口和实现了State接口的实体状态类。Context是一个带有某个状态的类。
    2、客户端类使用Context和State对象来演示Context在状态改变时的行为变化。

    系统实现

    /**
     * Context类
     */
    public class Context {
       private State state;
     
       public Context(){
          state = null;
       }
     
       public void setState(State state){
          this.state = state;     
       }
     
       public State getState(){
          return state;
       }
    }
    
    /**
     * 状态接口
     */
    public interface State {
       public void doAction(Context context);
    }
    
    /**
     * Start状态类
     */
    public class StartState implements State {
       @Override
       public void doAction(Context context) {
          System.out.println("Player is in start state");
          context.setState(this); 
       }
     
       public String toString(){
          return "Start State";
       }
    }
    
    /**
     * Stop状态类
     */
    public class StopState implements State {
       @Override
       public void doAction(Context context) {
          System.out.println("Player is in stop state");
          context.setState(this); 
       }
     
       public String toString(){
          return "Stop State";
       }
    }
    
    /**
     * 客户端
     */
    public class Client {
       public static void main(String[] args) {
          Context context = new Context();
    
          StartState startState = new StartState();
          startState.doAction(context);
          System.out.println(context.getState().toString());
     
          StopState stopState = new StopState();
          stopState.doAction(context);
          System.out.println(context.getState().toString());
       }
    }
    结果:
    Player is in start state
    Start State
    Player is in stop state
    Stop State
    
  • 相关阅读:
    【LeetCode】Hash
    【LeetCode】Heap
    【LeetCode】Stack
    【CodeVS】 纯OI题
    【LeetCode】String
    【LeetCode】Array
    WinForm窗体 常用属性
    C# ADO.NET 实体类中的属性扩展
    C# ADO.NET 三层架构
    C# ADO.NET 数据库的安全(sql 字符串注入攻击、使用占位符防止注入攻击)
  • 原文地址:https://www.cnblogs.com/feiqiangsheng/p/12242820.html
Copyright © 2011-2022 走看看