vaniglia 源码学习(二)

本文介绍了Vaniglia状态机特性的源代码实现,包括状态机配置、状态转移、事件触发及动作执行过程。通过实例展示了如何使用状态机进行企业级开发。

学习vaniglia的状态机特性源代码,这个特性在企业化开发中也是适用的,类似于struts2里配置action。基本功能如下,

1. 针对配置文件XX.XML

<StateMachine>
    <States>
        <State name="One" description="State One"/>
        <State name="Two" description="State Two"/>
    </States>
    <Events>
        <Event name="E-One" description="Event One"/>
    </Events>
    <Transitions>
        <Transition fromState="One" event="E-One" toState="Two">
            <Action class="org.vaniglia.statemachine.actions.LoggingAction">
                <LoggingPrefix value="ARC-ONE"/>
            </Action>
        </Transition>
    </Transitions>
</StateMachine>

2.针对上述配置文件操作如下:

public class Main {

    public static void main(String[] args) throws StateMachineConfigurationException, StateMachineException {
        StateFactory stateFactory = StateFactory.getInstance();
        EventFactory eventFactory = EventFactory.getInstance();


        StateMachine stateMachine1 = StateMachineConfigurator
        .createStateMachine("xml/statemachine/StateMachine.xml");//将Statemachine转换为stateMachine类

        State stateOne = stateFactory.getStateByName("One");
        Event eventOne = eventFactory.getEventByName("E-One");

        MyObject obj = new MyObject();
        obj.setState(stateOne);
        System.out.println("Initial State = "+obj.getState().getName());

        stateMachine1.handleEvent(obj, eventOne);//在状态机stateOne下处理事件eventOne
//完成状态机迁移,及action的操作。 stateMachine1.handleEvent(obj, eventOne); stateMachine1.handleEvent(obj, eventOne); stateMachine1.handleEvent(obj, eventOne);

3.整理类图如下:

4.核心代码算法在Statemachine类中,该类中保存两个映射表:

  • private ActionList[][] actionMatrix; 通过inputstate ID和outputstate ID索引action List
  • private int[][] transactionMatrix; 通过inputstate ID和event ID索引outputstate ID
  • state和event都有单例的工厂产生,主要是维护唯一的ID(nextID)
  • 在action中用户要实现的类(如LoggingAction)通过继承Action接口:
    public void handleEvent(ObjectWithState object, Event event, ActionParameter param) throws StateMachineException {
        State inputState = object.getState();
        if (inputState == null) {
            throw new StateMachineException("Object doesn't have a state assigned.");
        }

        int inputStateId = inputState.getId();
        int inputEventId = event.getId();

        if (inputStateId >= stateIDTraslator.length) {
            throw new StateMachineException("Invalid State");
        }

        if (inputEventId >= eventIDTraslator.length) {
            throw new StateMachineException("Invalid Event");
        }

        int outputStateId = transactionMatrix[stateIDTraslator[inputStateId]][eventIDTraslator[inputEventId]];
        if (outputStateId >= 0) {
            State outputState = states[stateIDTraslator[outputStateId]];
            ActionList actionList = actionMatrix[stateIDTraslator[inputStateId]][stateIDTraslator[outputStateId]];

            if (actionList != null) {
                for (int i = 0; i < actionList.size(); i++) {
                    Action action = actionList.get(i);
                    if (param != null) {
                        action.execute(inputState, outputState, object, param);
                    }
                    else {
                        action.execute(inputState, outputState, object);
                    }
                }
            }
            object.setState(outputState);
        }
    }

 

 

转载于:https://www.cnblogs.com/Fredric-2013/archive/2013/04/02/2994825.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值