Java设计模式之状态模式

来源:互联网 发布:单片机程序实验流程图 编辑:程序博客网 时间:2024/05/19 12:40

状态模式将各个状态所对应的操作分离开来,即对于不同的状态,由不同的子类实现具体操作,不同状态的切换由子类实现,当发现传入参数不是自己这个状态所对应的参数,则自己给Context类切换状态;而策略模式是直接依赖注入到Context类的参数进行选择策略,不存在切换状态的操作练习



状态模式适用于各个状态之间的切换场景模式下(状态切换判断)。--可用状态模式

判断的值与改变的状态无关(一般的状态判断

 用一句话来表述,状态模式把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。每种状态为一个类

 ●  环境(Context)角色,也成上下文:定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。这个具体状态类的实例给出此环境对象的现有状态。

  ●  抽象状态(State)角色:定义一个接口,用以封装环境(Context)对象的一个特定的状态所对应的行为。

  ●  具体状态(ConcreteState)角色:每一个具体状态类都实现了环境(Context)的一个状态所对应的行为。


以下为例子,红绿灯3种状态,当红灯时转换状态为绿灯,绿灯转为黄灯,黄灯转为红灯

package com.huawei.state;/** *  State需要两种类型实体参与:state manager 状态管理器 ,就是开关 ,如上面例子的Context实际就是一个state manager, 在state manager中有对状态的切换动作.用抽象类或接口实现的父类,,不同状态就是继承这个父类的不同子类. * @author Administrator * */public class Context {  private State state = null;  private String color = null;  public Context(State state,String color){this.state = state;this.color = color; }    public void change()  {  state.changeColor(this);  }   public State getState() {return state;}public void setState(State state) {this.state = state;}public String getColor() {return color;}public void setColor(String color) {this.color = color;}public static void main(String[] args) {Context c2 = new Context(new yellowClass(),"yellow");c2.change();System.out.println(c2.getColor());c2.change();System.out.println(c2.getColor());c2.change();System.out.println(c2.getColor());c2.change();System.out.println(c2.getColor());c2.change();System.out.println(c2.getColor());c2.change();System.out.println(c2.getColor());c2.change();/** * 输出结果 *///red//green//yellow//red//green//yellow}}interface State{void changeColor(Context Context);}class GreenClass implements State{@Overridepublic void changeColor(Context Context) {// TODO Auto-generated method stubif(Context.getColor()!=null&&Context.getColor().equals("green")){Context.setState(new yellowClass());Context.setColor("yellow");}}}class redClass implements State{@Overridepublic void changeColor(Context Context) {// TODO Auto-generated method stubif(Context.getColor()!=null&&Context.getColor().equals("red")){Context.setState(new GreenClass());Context.setColor("green");}}}class yellowClass implements State{@Overridepublic void changeColor(Context Context) {// TODO Auto-generated method stubif(Context.getColor()!=null&&Context.getColor().equals("yellow")){Context.setState(new redClass());Context.setColor("red");}}}



原创粉丝点击