mina狀態機是apache對狀態機模式的一種非常巧妙的實現,它本身自帶的錄音機的例子(
)和日常用的方式不太一樣,也不太好理解。
這裡對mina狀態機的使用方式做個簡要的說明,希望能對大家有點幫助。
首先要明白乙個概念:狀態機是乙個機器,它是可以生產加工一批東西的,只為了加工乙個物品而使用狀態機是不合適的。所以不要乙個object繫結乙個狀態機。
你可以把乙個物品交給狀態機處理。
我們仍然以tapedeck為例子,只是這裡tapedeck為乙個錄音機實體class:
tapedeck狀態圖
public class tapedeck
乙個錄音機例項對應乙個狀態上下文,這個很重要,因為狀態機操作的是狀態上下文,並不是實體類。
class tapedeckstatecontext extends abstractstatecontext }
那個介面(public inte***ce tapedeck)是什麼呢,它其實是狀態機的操作控制代碼(可以稱之為控制器),外部系統拿到這個控制器,將錄音機實體通過這個控制器的相應命令提交給狀態機,狀態機再控制這個實體的狀態。我們可以約定:控制器的第乙個引數(eventargs)為錄音機。所以這個錄音機操作控制代碼就可以實現成:
public inte***ce itapedeckcontroller
狀態機要用的狀態上下文怎麼拿呢?我們在tapedeck實體中加了tapedeckstatecontext屬性的。
狀態機是如何控制狀態變化的呢,最關鍵的handle來了。
public class tapedeckhandler @transition(on = "pause", in = playing, next = paused) public void onpausetape(tapedeckstatecontext context,string otherargument) }
handler可以有多個,在建立狀態機時可以將這些handler註冊進去。handler的如果需要其他引數可以在後面追加。
最後來看看狀態機的建立:
static statemachine statemachine = statemachinefactory.getinstance(transition.class).create(tapedeckhandler.empty, new tapedeckhandler(), new tapedeckotherhandler());
static itapedeckcontroller tapedeckcontroller= new statemachineproxybuilder().setstatecontextlookup(
new statecontextlookup()
} ).create(itapedeckcontroller.class, statemachine);
statemachine和tapedeckcontroller全域性只有乙個即可。
狀態機 狀態機0
近半年都忙於做專案,沒有太多的時間去整理和總結在專案中用過的技術 個人還是覺得技術需要總結提煉和沉澱的,忙到沒時間去總結提公升其實不 是什麼好事,這次講下狀態機,在戰鬥型別的遊戲中角色有多種不同的狀態,而狀態的切換錯綜複雜,23種設計模式中有一種模式叫做狀態模式,不過 這種模式是把狀態切換條件放到各...
python 狀態機 Python 狀態機
class statemachine def init self self.handlers 狀態轉移函式字典 self.startstate none 初始狀態 self.endstate 最終狀態集合 引數name為狀態名,handler為狀態轉移函式,end state表明是否為最終狀態 de...
狀態機小記
工作上有個功能模組用到了類似狀態機的東東,於是上網科普了一番。狀態機是由一系列輸入驅動,然後系統由其中一種狀態轉換為另一種狀態並產生某種輸出,這樣子的乙個系統叫做狀態機。狀態機分為兩種,一種是輸出只和系統狀態有關,叫做摩爾狀態機,另一種是輸出和輸入以及系統狀態都相關,叫做公尺莉狀態機。有關輸入 狀態...