状态模式将各个状态所对应的操作分离开来,即对于不同的状态,由不同的子类实现具体操作,不同状态的切换由子类实现,当发现传入参数不是自己这个状态所对应的参数,则自己给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
{
@Override
public void changeColor(Context Context) {
// TODO Auto-generated method stub
if(Context.getColor()!=null&&Context.getColor().equals("green"))
{
Context.setState(new yellowClass());
Context.setColor("yellow");
}
}
}
class redClass implements State
{
@Override
public void changeColor(Context Context) {
// TODO Auto-generated method stub
if(Context.getColor()!=null&&Context.getColor().equals("red"))
{
Context.setState(new GreenClass());
Context.setColor("green");
}
}
}
class yellowClass implements State
{
@Override
public void changeColor(Context Context) {
// TODO Auto-generated method stub
if(Context.getColor()!=null&&Context.getColor().equals("yellow"))
{
Context.setState(new redClass());
Context.setColor("red");
}
}
}