Java设计模式之State状态模式

网上也看些文章,有的模式和我写的差不多,有的就差别就很大,思路根本不一样。这不一定说谁对谁错,某些模式实现方式就有很多。还有网上一大堆的文章很多都一样,不一定是大家的观点,有些就是抄来抄去而且不带出处的,太坑爹了。

我说过我的JAVA文章仅代表一家观点,本人又是个彩笔,有什么错误在所难免。不过我还是要认真研究研究,也不能一味盲目相信。

今天还是继续写文章,Java设计模式系列之State状态模式。状态我们很熟悉了,像进程调度啊,线程运行啊,Hibernate中的实体类都有状态,这一步的状态是什么,要做什么,下一个状态又是什么,都需要确定。但是我们要判断事务的状态,有很多比如IF/ELSE ,SWITCH(),不过这样会导致大量的判断代码,网上就有一些大湿就提出IF/ELSE已死的说法,大牛就是意识超前啊,很多人现在就提出NOSQL设计,不见得就能被广泛的采用,有数据库巨头像Oracle肯定不同意撒,思想就是百家争鸣嘛,感兴趣的话了解了解。当然IF/ELSE太多的话很定不好撒,而且你要增加状态怎么办,像Android中的Activity的生命周期有七个状态,有人就说加IF/ELSE呗,用的地方太多难道要一个一个的改么。

我们的State状态模式就解决这个问题,这里就用四个状态,多了也一样,就是多加几个类,这就使得State模式的缺点暴露出来了,状态太多了有几十个就不宜用这个模式了。我们有一个State接口,其它的状态类实现这个接口,有四个状态类Create,Start,End,和Destroy。

State接口代码
package org.javaer.code.pattern.state;

import java.util.ArrayList;
import java.util.List;

public interface State {
        List<State> commands  = new ArrayList<State>();
 public void handle();
}

Create状态类代码
package org.javaer.code.pattern.state;

public class Create implements State {

        public Create() {
      commands.add(this);
        }
 @Override
 public void handle() {     
      execute(this);      
 }

 public void execute(State command){
     System.out.println(“create”);
     commands.get(commands.indexOf(this)+1).handle();
 }
}

Start状态类代码
package org.javaer.code.pattern.state;

public class Start implements State{

    public Start() {
 commands.add(this);
    }
 @Override
 public void handle() {
     execute(this);     
 }

 public void execute(State command){
     System.out.println(“start”);
     commands.get(commands.indexOf(this)+1).handle();
 }
}

End状态类代码
package org.javaer.code.pattern.state;

public class End implements State {

    public End() {
 commands.add(this);
    }
 @Override
 public void handle() {
     execute(this);
 }

 public void execute(State command){
     System.out.println(“end”);
     commands.get(commands.indexOf(this)+1).handle();
 }
}

Destroy状态类代码
package org.javaer.code.pattern.state;

public class Destroy implements State {

    public  Destroy() {
 commands.add(this);
    }
 @Override
 public void handle() {
     execute(this);
 }

 public void execute(State command){
     System.out.println(“destory”);
     //我这里加了这一句,就是想让它循环的转换状态,就会导致内存溢出
     commands.get(commands.indexOf(this)>=commands.size()-1?0:commands.indexOf(this)+1).handle();
 }
}

测试类Main代码
package org.javaer.code.pattern.state;

public class Main {
 @SuppressWarnings(“unused”)
 public static void main(String[] args) {
  State state1 = new Create();
  State state2 = new Start();
  State state3 = new End();
  State state4 = new Destroy(); 
  state1.handle();
 }
}

输出:
create
start
end
destory
create
start
end
destory
create
start
end
destory
.
.
.
.
.
Exception in thread “main” java.lang.StackOverflowError
 at sun.nio.cs.UTF_8.updatePositions(Unknown Source)
 at sun.nio.cs.UTF_8$Encoder.encodeArrayLoop(Unknown Source)
.
.
.
当然了状态处理handle方法没做啥子,就打印了个单词。
如果不想出现内存溢出(没有写方法停止),就把最后一个状态的handle方法的循环调用的一句代码去掉。
好了,状态模式就写完了,下面还是常用的Java设计模式,敬请持续关注。。。。
MSN:[email protected] 
Skype:donglinmeimei 转载请注明出处http://mtoou.info/java-state-moshi/

发表评论

邮箱地址不会被公开。 必填项已用*标注