程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java設計模式之State狀態模式

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方法的循環調用的一句代碼去掉。

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved