設計模式中的狀態(tài)模式
這是標準的狀態(tài)模式.其中Context管理所有狀態(tài),而每個(gè)狀態(tài)都是自己的類(lèi),而狀態(tài)的流轉邏輯由狀態(tài)自己執行.
然后完整的狀態(tài)模式實(shí)現太過(guò)”重”,而且狀態(tài)流轉的描述在代碼上也不會(huì )是一目了然.所以我對狀態(tài)模式進(jìn)行了簡(jiǎn)化和優(yōu)化.使其很”輕”,易于使用和實(shí)現,而且對于狀態(tài)流轉在代碼上也能一目了然.所有的流轉邏輯都能在一屏上顯示出來(lái).
先來(lái)介紹一下重新優(yōu)化后的狀態(tài)模式的一些概念:
代碼可以見(jiàn) https://github.com/zephyrleaves/easy-state
我們來(lái)看一個(gè)例子就能知道他是怎么用的了
首先我們先定義Event事件.
1 2 3 4 5 6 7 8 9 10 |
public enum OrderEvent implements Event{//正在進(jìn)行中
DO, //做完了 DONE; @Override public String getName() { return name(); } } |
可以看到Event實(shí)際是一個(gè)枚舉,列舉了一系列狀態(tài)相關(guān)的事件
然后我們再定義狀態(tài)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public enum OrderState implements State {@Next(arc = {“DO->END”, “DONE->END”})
INIT, @Next() TEST, END; @Override public int getValue() { return ordinal(); } @Override public String getOrginName() { return name(); } @Override public OrderState getStateByName(String name) { return valueOf(name); } } |
可以看到State本身也是枚舉,而不同的是在狀態(tài)上有@Next這樣的annotation來(lái)描述狀態(tài)流轉的邏輯
例如INIT上的@Next 表示當前如果發(fā)生DO這個(gè)Event,那么當前狀態(tài)就是跳轉到END上
最后看一下串聯(lián)起來(lái)的執行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
public class StatusTest {@org.testng.annotations.BeforeTest
public void setUp() { } @Test public void testConstuructor() { Status status = new Status(OrderState.INIT); //初始化狀態(tài)為INIT Assert.assertEquals(OrderState.valueOf(“INIT”), status.getCurrentState()); } @Test public void testHappen() { Status status = new Status(OrderState.INIT); //初始化狀態(tài)為INIT Assert.assertEquals(OrderState.INIT, status.getCurrentState()); HappenedResult result = status.happen(OrderEvent.DO); //當前狀態(tài)出發(fā)了DO事件 Assert.assertEquals(result, HappenedResult.SUCCESS); //跳轉成功 Assert.assertTrue(result.isSuccess()); Assert.assertEquals(status.getCurrentState(), OrderState.END); //當前狀態(tài)已經(jīng)跳轉為END Assert.assertEquals(status.getPreviousState(), OrderState.INIT); //上一個(gè)狀態(tài)為INIT HappenedResult result1 = status.happen(null); //沒(méi)有發(fā)生事件 Assert.assertEquals(result1, HappenedResult.NO_EVENT); //提示你沒(méi)事件發(fā)生 Assert.assertEquals(status.getCurrentState(), OrderState.END); //當前狀態(tài)還是END Assert.assertEquals(status.getPreviousState(), OrderState.INIT); //上一個(gè)狀態(tài)還是INIT HappenedResult result2 = status.happen(OrderEvent.DONE); //在當前狀態(tài)發(fā)了DONE事件 Assert.assertEquals(result2, HappenedResult.NO_NEXT); //這個(gè)狀態(tài)下沒(méi)有定義會(huì )觸發(fā)DONE事件 Assert.assertEquals(status.getCurrentState(), OrderState.END); //當前狀態(tài)還是END Assert.assertEquals(status.getPreviousState(), OrderState.INIT); //上一個(gè)狀態(tài)還是INIT Status status1 = new Status(OrderState.TEST); //初始化狀態(tài)為T(mén)EST HappenedResult result3 = status1.happen(OrderEvent.DO); //在當前狀態(tài)發(fā)了DO事件 Assert.assertEquals(result3, HappenedResult.NO_ARC); //這個(gè)狀態(tài)下沒(méi)有定義會(huì )觸發(fā)的事件 Assert.assertEquals(status1.getCurrentState(), OrderState.TEST); //當前狀態(tài)還是TEST Assert.assertEquals(status1.getPreviousState(), null); //沒(méi)有上一個(gè)狀態(tài) } } |
Copyright@ 2011-2016 版權所有:大連千億科技有限公司 遼ICP備11013762-3號 google網(wǎng)站地圖 百度網(wǎng)站地圖 網(wǎng)站地圖
公司地址:大連市沙河口區中山路692號辰熙星海國際2317 客服電話(huà):0411-39943997 QQ:2088827823 37482752
法律聲明:未經(jīng)許可,任何模仿本站模板、轉載本站內容等行為者,本站保留追究其法律責任的權利! 隱私權政策聲明