允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。 其别名为状态对象(Objects for States),状态模式是一种对象行为型模式
在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的(stateful)对象,这样的对象状态是从事先定义好的一系列值中取出的。当一个这样的对象与外部事件产生互动时,其内部状态就会改变,从而使得系统的行为也随之发生变化。
这里我们模拟一个QQ的状态转换过程
抽象状态类
1 package state; 2 ? 3 public interface State { 4 public void handle(Context context); 5 }
拥有多种状态的对象
1 package state; 2 ? 3 public class Context { 4 private State state; 5 ? 6 public State getState() { 7 return state; 8 } 9 ? 10 public void setState(State state) { 11 this.state = state; 12 } 13 ? 14 public Context(State state) { 15 this.state = state; 16 } 17 ? 18 public void contexthandle(){ 19 state.handle(this); 20 } 21 }
具体状态类
1 package state; 2 ? 3 public class ConcreteState implements State { 4 @Override 5 public void handle(Context context) { 6 System.out.println("忙碌状态"); 7 //状态转换 8 context.setState(new ConcreteStateC()); 9 } 10 }
具体状态类
1 package state; 2 ? 3 public class ConcreteStateB implements State { 4 @Override 5 public void handle(Context context) { 6 System.out.println("离线状态"); 7 //状态转换 8 context.setState(new ConcreteState()); 9 } 10 }
具体状态类
1 package state; 2 ? 3 public class ConcreteStateC implements State{ 4 @Override 5 public void handle(Context context) { 6 System.out.println("在线状态"); 7 //状态转换 8 context.setState(new ConcreteStateB()); 9 } 10 }
客户端
1 package state; 2 3 public class Clinet { 4 public static void main(String[] args) { 5 Context context = new Context(new ConcreteStateC()); 6 context.contexthandle(); 7 context.contexthandle(); 8 context.contexthandle(); 9 System.out.println(); 10 context.contexthandle(); 11 context.contexthandle(); 12 context.contexthandle(); 13 } 14 }
控制台输出
共同的特点:对象的行为依赖于它的状态(属性)并且可以根据它的状态改变而改变它的相关行为
原文:https://www.cnblogs.com/lm273/p/12004783.html