上一節(jié)介紹了State,Event的實(shí)現(xiàn)叶堆,相對簡單一些阱飘,所有的邏輯圍繞的是事件驅(qū)動所需要的表示問題,這種概念性的東西虱颗,我盡量每節(jié)少講沥匈,保持一個比較高的更新頻率,方便消化忘渔。這一節(jié)將介紹Action高帖,將會越來越接近狀態(tài)的流轉(zhuǎn)核心。
Action干的那些事
Action顧名思義是行為畦粮,即狀態(tài)流轉(zhuǎn)要進(jìn)行的操作散址,是具體的業(yè)務(wù)邏輯的實(shí)現(xiàn)。Action的定義比較隨意宣赔,但也比較講究预麸。隨意的是你所有的邏輯都是寫在Action里的,可按照自己喜歡的編程方式來定義儒将,甚至可以按需實(shí)現(xiàn)一些接口來達(dá)到拓展的目的(當(dāng)然要在狀態(tài)機(jī)的流轉(zhuǎn)里對拓展添加必要的邏輯)师崎。講究的是Action里要提供一些約定的固定的方法來讓狀態(tài)機(jī)執(zhí)行,另外為了上線文的傳遞椅棺,拓展的方法的參數(shù)最好為context犁罩,方便狀態(tài)機(jī)的操作。
Action的執(zhí)行結(jié)果決定了狀態(tài)的下一個流轉(zhuǎn)狀態(tài)两疚。一個State在接收到一個Event床估,根據(jù)執(zhí)行的結(jié)果可能有兩種狀態(tài)(也可以細(xì)化分為三種,所謂的第三種為自旋诱渤,執(zhí)行完了丐巫,再回到自己,這是一種比較特殊的流轉(zhuǎn),可以劃為將介紹的兩種递胧,也可以單獨(dú)拎出來講一講碑韵,我們選擇劃歸將要介紹的兩種):1. 無論Action的執(zhí)行結(jié)果如何,目標(biāo)狀態(tài)只有一種狀態(tài) 2.目標(biāo)狀態(tài)根據(jù)Action的執(zhí)行結(jié)果缎脾,存在多個不同的目標(biāo)狀態(tài)的可能祝闻。我們將存在存在多個目標(biāo)狀態(tài)的Action定位為決策Action,因?yàn)槲覀兙痛嬖诹藘煞NAction的定義
Action代碼實(shí)現(xiàn)
實(shí)現(xiàn)相對簡單遗菠,直接上代碼了
public interface Action {
/**
* 是否滿足執(zhí)行條件
* @return
*/
boolean isSatisfied(Context context);
/**
* 狀態(tài)變更前
* @param context
*/
void beforeStateChange(Context context);
/**
* 狀態(tài)變更后
* @param context
*/
void afterStateChange(Context context);
}
Action接口定義了一些通用的行為联喘,這里只是列舉了常用的一些,但是不見得就滿足了所有的讀者的需求辙纬,所有讀者有個性的話的操作豁遭,也可以在這里定義。isSatisfied做一些當(dāng)前是否滿足了執(zhí)行條件贺拣,不滿足就繼續(xù)等待蓖谢,不執(zhí)行Action,等待下次觸發(fā)譬涡。beforeStateChange指在狀態(tài)變更前進(jìn)行的操作(并不是Action執(zhí)行前)闪幽,其實(shí)是指Action結(jié)束了,將要執(zhí)行狀態(tài)変更要做的操作昂儒。afterStateChange是狀態(tài)変更后要做的事
public interface NormalAction extends Action {
/**
* 執(zhí)行
* @param context
*/
void doAction(Context context);
}
我們將只會有一個目標(biāo)狀態(tài)的Action取名NormalAction沟使,所以也沒必要有返回值
public interface DecisionAction<S extends State> extends Action{
/**
* 狀態(tài)決策Action
* @param context
* @return
*/
S doDecideAction(Context context);
}
存在多種可能返回狀態(tài)的,我們?nèi)∶鸇ecisionAction渊跋,doDecideAction是要有具體的State返回的腊嗡。
上述所有的方法里參數(shù)都是Context,只是一個上下文拾酝,用來傳遞參數(shù)燕少,目前可以先忽略,下一節(jié)介紹蒿囤。定義Action的時候客们,都是實(shí)現(xiàn)NormalAction 或 DecisionAction 接口。