状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式。状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样。
状态接口
public interface Status { public void action(); }状态1
public class Status1 implements Status { private Context context; public Status1(Context context) { this.context = context; } @Override public void action() { System.out.println("状态1执行完毕,变成状态2"); context.setStatus(context.getStatus2()); context.execute(); } }状态2
public class Status2 implements Status { private Context context; public Status2(Context context) { this.context = context; } @Override public void action() { System.out.println("状态2执行完毕,变成状态3"); context.setStatus(context.getStatus3()); context.execute(); } }状态3
public class Status3 implements Status { private Context context; public Status3(Context context) { this.context = context; } @Override public void action() { System.out.println("状态3执行完毕,变回状态1"); context.setStatus(context.getStatus1()); } }全局对象(持有状态)
public class Context { private Status1 status1 ; private Status2 status2; private Status3 status3; private Status status; public Context() { //默认3种状态 status1 = new Status1(this); status2 = new Status2(this); status3 = new Status3(this); //初始状态为状态1 status = status1; } public Status getStatus() { return status; } public void setStatus(Status status) { this.status = status; } public Status1 getStatus1() { return status1; } public Status2 getStatus2() { return status2; } public void execute(){ this.getStatus().action(); } public Status3 getStatus3() { return status3; } }测试类
public class StatusTest { public static void main(String[] args) { Context context = new Context(); context.execute(); } }效果:
状态1执行完毕,变成状态2 状态2执行完毕,变成状态3 状态3执行完毕,变回状态1可参考
策略模式封装了一组相关算法,它允许Client在运行时使用可互换的行为;状态模式帮助一个类在不同的状态显示不同的行为。(简单的来理解策略模式是在同一时刻不同的行为,状态模式是在不同时刻不同行为)状态模式封装了对象的状态,而策略模式封装算法或策略。因为状态是跟对象密切相关的,它不能被重用;而通过从Context中分离出策略或算法,我们可以重用它们。(状态对象中会持有一个对象的引用,状态只能被该对象使用)在状态模式中,每个状态通过持有Context的引用,来实现状态转移;但是每个策略都不持有Context的引用,它们只是被Context使用。(跟第二点类似)状态模式中很好的定义了状态转移的次序;而策略模式并无此需要:Client可以自由的选择任何策略。(状态模式强调状态的改变)最后但最重要的一个不同之处是,策略的改变由Client完成;而状态的改变,由Context或状态自己(具体策略在客户端中实现并使用,但是具体的状态在context执行某个方法或者其中一个方法执行完毕之后自动转换到另一个状态)