Java设计模式之状态模式

1.状态模式的定义

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。

2.状态模式示意类

Context类:环境类,包括一些内部状态。 State类—抽象状态类,state定义的一个所有的具体状态的共同接口,任何状态都能实现这个接口,这样一来状态之间可以互相转换。 ConcreteState类:具体的状态类。用于处理来自Context的请求,每一个ConcreteState都实现了context一个状态相关的行为,所以当context改变状态时,行为也会跟着改变。

3.状态模式结构图


结构图

4.示例代码

实例:push显示红-〉黄-〉绿,pull显示绿-〉黄-〉红

public interface State

{

public void handlePush(Context context);

public void handlePull(Context context);

public String getColor();

} public class Context

{

private State state = null;

public State getState()

{

return state;

}

public void setState(final State state)  {

this.state = state;

}

public void push()  {

state.handlePush(this);

}

public void pull()   {

state.handlePull(this);

}

}

//RED public class ConcreteStateA implements State {

@Override

public void handlePush(final Context context)  {

System.out.print(this.getColor());

final State state = new ConcreteStateB();

context.setState(state);

state.handlePush(context);

}

@Override

public void handlePull(final Context context)  {

System.out.print(this.getColor());

}

@Override

public String getColor() {

return "RED";

}

}

//YELLOW public class ConcreteStateB implements State

{

@Override

public void handlePush(final Context context)  {

System.out.print(this.getColor());

final State state = new ConcreteStateC();

context.setState(state); state.handlePush(context);

}

@Override

public void handlePull(final Context context)  {

System.out.print(this.getColor());

final State state = new ConcreteStateA();

context.setState(state);

state.handlePull(context);  }

@Override

public String getColor()  {

return "YELLOW";

}

}

//green public class ConcreteStateC implements State

{

@Override

public void handlePush(final Context context)  {

System.out.print(this.getColor());

}

@Override

public void handlePull(final Context context)

{

System.out.print(this.getColor());

final State state = new ConcreteStateB();

context.setState(state);

state.handlePull(context);

}

@Override

public String getColor()

{

return "GREEN";

}

}

public class Client   {

public static void main(final String[] args)  {

// YTODO Auto-generated method stub final Context context = new Context();

context.setState(new ConcreteStateA());

System.out.println("PUSH:");

context.push();

System.out.println("\nPULL:"); context.pull(); }

}

结果: PUSH: REDYELLOWGREEN PULL: GREENYELLOWRED

总结:

       状态模式的优点是 : 将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。 特定状态的相关的行为都放入一个对象中,由于所有的与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类,可以很容易的增加新的状态和转换 。而且消除了庞大的条件分支语句,通过各种状态把逻辑分布到state的子类之中,来减少相互之间的依赖。

       #注意#:使用前需要枚举可能的状态,否则可能也会有一些工作量。例如新增一个预留状态,除了新增一个预留状态ConcreteState类,还需要在状态State接口中新增预留接口,Room类中新增预留状态,各个ConcreteState接口类增加与预留状态相互的关系行为。 这也大致体现了状态模式的缺点,必然性的会增加系统中类和对象的个数。使用不当会导致系统的复杂性增加。如果预先状态设计不能全面,对开闭原则支持的就不太好,对于互相切换状态的系统,新增新的状态会修改那些负责状态转换和对应类的代码。


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 设计模式分类 总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原...
    lifeline丿毅阅读 1,259评论 0 2
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,779评论 18 399
  • 面向对象的六大原则 单一职责原则 所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这个类就具有多于...
    JxMY阅读 975评论 1 3
  • 两千多年前,汉武帝时期。 一个暗室。一个年轻人被关在这里。他不知道自己为什么被关,更不知道关押自己的是些什么人,一...
    战国客阅读 1,368评论 1 13
  • 【想成为审核员吗?请联系我】早之前审核员是一项非常神秘而小众的职业,而如今由于政策的放开,更多认证机构的成立,打破...
    我是霓凰郡主阅读 1,155评论 0 2