zoukankan      html  css  js  c++  java
  • 行为型模式之状态模式

     
    一.定义
      状态模式(State Pattern) :允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。其别名为状态对象(Objects for States),状态模式是一种对象行为型模式。
     
    二、模式结构成员构成

    • Context: 环境类

    • State: 抽象状态类

    • ConcreteState: 具体状态类

    三.代码示例
     1 /**
     2  * State
     3  * 抽象状态类
     4  */
     5 public interface State {
     6    public void doAction(Context context);
     7 }
     8 
     9 /**
    10  * ConcreteState
    11  * 具体状态类
    12  */
    13 public class StartState implements State {
    14  
    15    @Override
    16    public void doAction(Context context) {
    17       System.out.println("Player is in start state");
    18       context.setState(this); 
    19    }
    20  
    21    @Override
    22    public String toString(){
    23       return "Start State";
    24    }
    25 }
    26 
    27 /**
    28  * ConcreteState
    29  * 具体状态类
    30  */
    31 public class StopState implements State {
    32  
    33    @Override
    34    public void doAction(Context context) {
    35       System.out.println("Player is in stop state");
    36       context.setState(this); 
    37    }
    38  
    39    @Override
    40    public String toString(){
    41       return "Stop State";
    42    }
    43 }
    44 
    45 /**
    46  * Context
    47  * 环境类
    48  */
    49 public class Context {
    50    private State state;
    51  
    52    public Context(){
    53       state = null;
    54    }
    55  
    56    public void setState(State state){
    57       this.state = state;     
    58    }
    59  
    60    public State getState(){
    61       return state;
    62    }
    63 }
    64 
    65 /**
    66  * client
    67  */
    68 public class Client {
    69 
    70     public static void main(String[] args) {
    71         Context context = new Context();
    72 
    73         StartState startState = new StartState();
    74         startState.doAction(context);
    75 
    76         System.out.println(context.getState().toString());
    77 
    78         StopState stopState = new StopState();
    79         stopState.doAction(context);
    80 
    81         System.out.println(context.getState().toString());
    82     }
    83 }
    View Code
     
    四.优点和缺点分析
    优点:
    >枚举可能的状态,在枚举状态之前需要确定状态种类。
    >将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为.
    >允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句
    >可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数
    >封装了转换规则
     
    缺点:
    >状态模式的使用必然会增加系统类和对象的个数
    >状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱
     
    五.应用场景
    >对象的行为依赖于它的状态(属性)并且可以根据它的状态改变而改变它的相关行为
    >代码中包含大量与对象状态有关的条件语句,这些条件语句的出现,会导致代码的可维护性和灵活性变差,不能方便地增加和删除状态,使客户类与类库之间的耦合增强。在这些条件语句中包含了对象的行为,而且这些条件对应于对象的各种状态
  • 相关阅读:
    【做题】提高组过关测试题1
    【做题】arc078_f-Mole and Abandoned Mine——状压dp
    【学习】Hall’s Marriage Theorem
    【做题】arc072_f-Dam——维护下凸包
    一文尽览近似最近邻搜索中的哈希与量化方法
    InsightFace源码以及pre-train模型以及使用
    无法解析的外部符号 jpeg_std_error
    威布尔weibull distribution
    中科院- 生物特征识别概述
    Face-Resources
  • 原文地址:https://www.cnblogs.com/756623607-zhang/p/9251194.html
Copyright © 2011-2022 走看看