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

    状态模式

    通过改变对象内部的状态来帮助对象控制自己的行为

    状态机

    状态图

    image-20200617211833356

    实现1.0

    状态

    final static int SOLD_OUT = 0;
    final static int NO_QUARTER = 1;
    final static int HAS_QUARTER = 2;
    final static int SOLD = 3;
    int state;
    

    动作

    public void *(){
       	if(state == SOLD_OUT){
       		// TODO    
        }else if(state == NO_QUARTER){
           // TODO 
        }else if(state == HAS_QUARTER){
           // TODO 
        }else if(state == SOLD){
           // TODO 
        }
    }
    

    问题

    如果将来加入了新的状态,全部动作方法都要做出修改

    • 不符合开放-关闭原则
    • 新加入代码可能有bug
    • 状态转换藏在条件语句中,不明显

    实现2.0

    • 定义一个state接口
    • 每个状态实现状态类,负责对应状态下的行为
    • 将动作委托到状态类
    • 状态机上的每一个状态是一个状态类

    image-20200617211901063

    上下文(糖果机类)

    image-20200617211930156

    状态类

    image-20200617211918878

    问题

    还是有耦合,如果增加了新的状态类还是需要在上下文中进行修改

    解决方法:

    状态类的获取从容器中获取,或者通过反射生成,不写死在上下文类中

    状态模式

    image-20200617211849272

    • 状态流向

      • 固定转换,适合放在context中
      • 动态更换,适合放在状态类中
    • 多个context实例可以共享状态对象。

      • 前提:状态对象不能持有他们自己的内部状态
      • 需要把每个状态指定到静态的实例变量中
  • 相关阅读:
    JAVA之数组
    Linux之判断字符串是否为空
    Python之操作HBASE数据库
    【转】Linux之crontab定时任务命令
    Python之shutil模块(复制移动文件)
    JAVA之列表集合ArrayList
    Python之多线程多进程
    前端之Javascript
    前端之DOM操作
    【转】写一个简单的爬虫来批量爬取新浪网的新闻
  • 原文地址:https://www.cnblogs.com/cpaulyz/p/13173366.html
Copyright © 2011-2022 走看看