设计模式3—State设计模式

来源:互联网 发布:去小公司写php怎么样 编辑:程序博客网 时间:2024/06/02 19:19

State状态设计模式类似于Switch多路分支功能的开关,State状态模式机制如下:

状态模式UML图如下:

 

State状态设计模式用于改变对象的行为,在代理的生命周期里,随着状态变化从一个目标实现程序切换到另一个目标实现程序。

我们经常遇到如下的程序代码:

public class Creature {

     private Boolean isFrog = true;//标识

     public void greet(){

            if(isFrog){

               System.out.println("Ribbet!");

           }else{

                System.out.println("Darling!");

          }

       }

      //转换标识

       public void kiss(){

           isFrog = false;

       }

      public static void main(String[] args){

           Creature creature = new Creature();

           creature.greet();

           creature.kiss();

           creature.greet();

       }

}

上面例子代码中greet()方法在执行具体操作之前必须要判断一下标识,代码显得笨拙繁琐,使用简单State状态模式改写上面代码如下:

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状态设计模式中,状态自动切换并传播,不需要再改动标识,代码显得非常优雅。

State状态设计模式一个基本框架如下:

//状态接口

interface State{

   void operation1();

   void operation2();

   void operation3();

}

//状态实现类1

class implementation1 implements State{

     public void operation1(){

         System.out.println("Imlementation1.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.sate = state;

        }

       //状态更改

       public void changeState(State newState){

            state = newState;

      }

     public void service1(){

          //...

         state.operation1();

         //...

        state.operation3();

  }

  public void service2(){

       //...

       state.operation1();

      //...

        state.operation2();

}

publc 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状态模式中被调用的目标程序有多个。

(2)Proxy代理模式的目的是控制客户端对目标程序的访问,而State状态模式是为了根据条件动态改变目标程序。

0 0
原创粉丝点击