设计模式之状态模式(行为型)

举报
yd_273762914 发表于 2020/12/02 23:54:47 2020/12/02
【摘要】 模式定义 一个对象在其内部状态改变时改变其行为,这个对象我们可以称为状态对象,所以状态模式是一种对象行为型模式。 模式结构 Context:环境类 Context类也可以称之为上下文类,实际上就是拥有状态的对象,可以理解为状态管理器。 State:抽象状态类 抽象状态类可以是一个接口类或者抽象类,反正实现的话都是通过具体状态类。抽象状态类,封装环境类不同状态下...

模式定义

一个对象在其内部状态改变时改变其行为,这个对象我们可以称为状态对象,所以状态模式是一种对象行为型模式。

模式结构

  • Context:环境类
    Context类也可以称之为上下文类,实际上就是拥有状态的对象,可以理解为状态管理器。

  • State:抽象状态类
    抽象状态类可以是一个接口类或者抽象类,反正实现的话都是通过具体状态类。抽象状态类,封装环境类不同状态下的所有动作方法。

  • ConcreteState:具体状态类
    具体实现类就比较容易理解了,就是继承抽象状态类,实现具体的方法,不一定所有的抽象方法都有重写,根据环境类状态的改变进行重写就好,其实也是根据状态改变改变动作方法。

模式适用场景

  • 状态模式适用于行为随状态改变的业务场景,比如状态改变了,行为也会做成改变。
  • 业务代码中很多条件的情况,加入一些代码有很多的if…else,并且经常改变,这种情况就可以使用状态模式进行编写。

业务应用场景:

  • 比如OA的审批就可以应用状态模式,发起申请之后,审批状态可能有受理,批准等等状态,每个状态具有不一样的动作;

  • 游戏的角色扮演,每次游戏版本升级都是会出现状态动作的改变,用状态模式进行设计,可以提高程序可拓展性;

简单实例

上下文类:

public class Context { private State state; public Context(){ state = null; } public void setState(State state){ this.state = state; } public State getState(){ return state; }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

抽象状态类:

public abstract class State { public void doAction(Context context);
}

  
 
  • 1
  • 2
  • 3

具体状态类:

public class ConcreteState implements State { public void doAction(Context context) { System.out.println("Player is in start state"); context.setState(this); } public String toString(){ return "Start State"; }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

调用代码:

public class StatePatternDemo { public static void main(String[] args) { Context context = new Context(); ConcreteState concreteState = new ConcreteState(); concreteState.doAction(context); System.out.println(context.getState().toString()); }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

状态模式分类

状态模式分为简单状态模式和可切换状态模式。

  • 简单状态模式
    简单状态模式就是指状态相对独立,具体状态类可以根据抽象状态类进行编程,也就是不需要用环境类中的setState方法改变状态

  • 可切换状态的状态模式
    可切换状态模式是状态可以变换的,状态变换了,具体状态类在调用时就要使用环境类的setState改变状态

文章来源: smilenicky.blog.csdn.net,作者:smileNicky,版权归原作者所有,如需转载,请联系作者。

原文链接:smilenicky.blog.csdn.net/article/details/85219470

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。