首页 > 其他 > 详细

Design Pattern:状态模式

时间:2020-06-21 18:37:54      阅读:68      评论:0      收藏:0      [点我收藏+]

状态模式

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

状态机

状态图

技术分享图片

实现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接口
  • 每个状态实现状态类,负责对应状态下的行为
  • 将动作委托到状态类
  • 状态机上的每一个状态是一个状态类

技术分享图片

上下文(糖果机类)

技术分享图片

状态类

技术分享图片

问题

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

解决方法:

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

状态模式

技术分享图片

  • 状态流向

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

    • 前提:状态对象不能持有他们自己的内部状态
    • 需要把每个状态指定到静态的实例变量中

Design Pattern:状态模式

原文:https://www.cnblogs.com/cpaulyz/p/13173366.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!