在线看片电视剧免费看,精品国产一区二区三区2021,99久久久无码国产精品免费,精品人妻少妇嫩草AV无码专区

    電話(huà)

    0411-39943997

仟億科技
客服中心
  • 電話(huà)
  • 電話(huà)咨詢(xún):0411-39943997
  • 手機
  • 手機咨詢(xún):15840979770
    手機咨詢(xún):13889672791
網(wǎng)絡(luò )營(yíng)銷(xiāo) >更多

設計模式中的狀態(tài)模式的一個(gè)小改進(jìn)

作者:billionnet 發(fā)布于:2012/5/6 20:14:17 點(diǎn)擊量:

 

設計模式中的狀態(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)模式的一些概念:

  • State:首先就是狀態(tài)
  • Event:事件,事件的觸發(fā)使State狀態(tài)發(fā)生改變
  • Next:實(shí)為路徑,就是描述一個(gè)狀態(tài) 觸發(fā)某個(gè)事件后會(huì )變成具體其他狀態(tài)的描述
  • Status:狀態(tài)實(shí)例,State只是狀態(tài)的描述,而Status就狀態(tài)的實(shí)例,可以被執行根據State的描述來(lái)轉換成新的State

代碼可以見(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)許可,任何模仿本站模板、轉載本站內容等行為者,本站保留追究其法律責任的權利! 隱私權政策聲明

色综合久久久久久久久五月| 亚韩无码一区二区在线视频| 色资源AV中文无码先锋| 国产精品成熟老女人视频| 久久久久久久久久久久中文字幕| 青青青在线视频国产|