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);
        }
    }
复制代码

 

 

posted @   Fredric_2013  阅读(184)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示