State状态设计模式相似于Switch多路分支功能的开关,State状态模式机制以下: java
状态模式UML图以下: 设计模式
State状态设计模式用于改变对象的行为,在代理的生命周期里,随着状态变化从一个目标实现程序切换到另外一个目标实现程序。 框架
咱们常常遇到以下的程序代码: ide
public class Creature{ private Boolean isFrog = true;//标识 public void greet(){ if(isForg){ System.out.println(“Ribbet!”); }else{ System.out.println(“Darling!”); } } //转换标识 public void kiss(){ isForg = false; } public static void main(String[] args){ Creature creature = new Creature(); creature.greet(); creature.kiss(); creature.greet(); } }
上面例子代码中greet()方法在执行具体操做以前必需要判断一下标识,代码显得笨拙繁琐,使用简单State状态模式改写上面代码以下: this
public class Creature{ //状态接口 private interface State{ String response(); } private class Forg implements State{ public String response(){ return “Ribbet!”; } } private class Prince implements State{ public String response(){ return “Darling!”; } } private State state = new Forg(); public void greet(){ System.out.println(state.response); } public void kiss(){ state = new Prince(); } public static void main(String[] args){ Creature creature = new Creature(); creature.greet(); creature.kiss(); creature.greet(); } }
State状态设计模式中,状态自动切换并传播,不须要再改动标识,代码显得很是优雅。 spa
State状态设计模式一个基本框架以下: 设计
//状态接口 interface State{ void operation1(); void operation2(); void operation3(); } //状态实现类1 class implementation1 implements State{ public void operation1(){ System.out.println(“Implementation1.operation1()”); } public void operation2(){ System.out.println(“Implementation1.operation2()”); } public void operation3(){ System.out.println(“Implementation1.operation3()”); } } //状态实现类2 class implementation2 implements State{ public void operation1(){ System.out.println(“Implementation2.operation1()”); } public void operation2(){ System.out.println(“Implementation2.operation2()”); } public void operation3(){ System.out.println(“Implementation2.operation3()”); } } //服务提供者 class ServiceProvider{ private State state; public ServiceProvider(State state){ this.state = state; } //状态更改 public void changeState(State newState){ state = newState; } public void service1(){ //…… state.operation1(); //…… state.operation3(); } public void service2(){ //…… state.operation1(); //…… state.operation2(); } public void service3(){ //…… state.operation3(); //…… state.operation2(); } } public class StateDemo{ private ServiceProvider sp = new ServiceProvider(new Implementation1()); private void run(ServiceProvider sp){ sp.service1(); sp.service2(); sp.service3(); } public static void main(String[] args){ StateDemo demo = new StateDemo(); demo.run(sp); sp.changeState(new Implementation2()); demo.run(sp); } }
State状态模式和Proxy代理模式都为客户端程序提供了一个目标程序代理,真正的目标程序被代理所隐藏,当客户端程序调用目标程序时,首先将调用请求发送给代理,代理才真正调用目标程序,可是Proxy代理模式和State状态模式有以下区别: 代理
(1) Proxy代理模式中被调用的目标程序只有一个,而State状态模式中被调用的目标程序有多个。 code
(2) Proxy代理模式的目的是控制客户端对目标程序的访问,而State状态模式是为了根据条件动态改变目标程序。 对象