设计模式4——State设计模式

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状态模式是为了根据条件动态改变目标程序。 对象