State模式学习笔记

State的用意在于,允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了他的类。

State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If else if else 进行状态切换, 如果针对状态的这样判断切换反复出现,我们就要联想到是否可以采取State模式了.

大家知道,State的用意在于,允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了他的类。我们先看http://www.javacoder.net/patterns.jsp 上提供的GOF SOFTWARE DESIGN PATTERNS CATALOGUE的State模式源码实现。

  首先看接口类,State.java

 public interface State {

  public void handle();

 }

   定义接口以封装与Conext的一个特定状态相关的行为。

  然后看,接口的实现类。

    第一个,ConcreteState1.java

 public class ConcreteState1 implements State {

    public void handle() {

        System.out.println("ConcreteState1.handle() executing");

   }

  }

 

 第二个,ConcreteState2.java

 public class ConcreteState2 implements State {

   public void handle() {
     System.out.println("ConcreteState2.handle() executing");
   }

 }

  

  这两个类实现了State接口。

  然后再看,Context.java是如何将上述三个.java文件联系起来。

public class Context {

  public static final int STATE_ONE = 0;

  public static final int STATE_TWO = 1;

 

 //大家注意,这句话很关键,该模式做手脚的地方!

private State currentState = new ConcreteState1();

  public void request() {

  currentState.handle();

  }

  public void changeState(int state) {

  switch (state) {

  case STATE_ONE:

  currentState = new ConcreteState1();//关键点

  break;

  case STATE_TWO:

  currentState = new ConcreteState2();//关键点

  break;

  }

  }

  }

 

 

       这样,写好4个.java文件后,其实您已经实现了State设计模式,很有趣,对吧?就是这样简单。

  再看看如何使用该设计模式了。写一个Client.java看看。

[code]public class Client {

  public static void main(String[] args) {

  // 构造Context

  Context ctx = new Context();

  // 唤起Context.request()

  ctx.request();

  // 改变ctx的状态?为什么改变了呢?大家想想看。

  ctx.changeState(Context.STATE_TWO);

  // 再次唤起Context.request(),结果大不一样。

  ctx.request();

  }

  }[/code]

 

 

 

参考网页:http://hi.baidu.com/showyearn/blog/item/cce15c0906648c85d0581b1f.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值