您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center   Code  
会员   
   
业务架构设计
4月18-19日 在线直播
基于UML和EA进行系统分析设计
4月25-26日 北京+在线
AI 智能化软件测试方法与实践
5月23-24日 上海+在线
     
   
 
 订阅
状态机学习及对一段 java 代码的改写
 
作者:木野狐
   次浏览      
 2007-6-26
 
编辑推荐:
本文介绍UML状态机视图状态和转换,希望对您的学习有所帮助。
本文来自cnblogs,由火龙果软件Linda编辑、推荐。

《敏捷软件开发:原则、模式与实践》这本书中的第 29 章讲解了 State 模式,例子是地铁里的十字转门。书中对于状态机的实现,有一个范例是使用迁移表来实现(程序 29.12, P382),这里不列出详细代码。

我在这个例子里面了解到,原来 java 还支持 private interface,并且可以不创建接口的实例,而直接生成一个实现了接口的对象。使用的语法是类似于 C# 里匿名函数一样的内嵌定义语法。

不过,例子中的 interface 定义的作用,仅仅是为了能够方便的创建迁移表,以及在循环遍历迁移表的时候,可以用一致的语法去调用方法。这可不就是 C# 的 delegate 所起的作用吗?
因此我用 C# 语法重写了这个例子,由于使用了 delegate,代码减少了大概一半。

记得在网上也看到有不少说法称 C# 中 delegate 的设计违反了 OO 的设计原则,但是从这个例子中我们可以看到,delegate 确实非常方便,在某些情况下可以大幅度简化设计,相比而言原书上的 java 程序例子,在一个 class 内部定义 private interface,然后再定义其实现,导致了很多只有一句话的代理方法,感觉非常臃肿和复杂。最主要是这里的 interface 定义是 private 的,变得毫无疑义。因此用 delegate 语法替换是一种便捷而无害的做法。

思考:并非纯粹 OO 的语言就是最好的语言,很多场景下,OO 跟过程式混合使用会带来更高的生产力。比如 python 和 delphi 就都支持这样的特性。

附 C# 的实现代码:

using System;
using System.Collections.Generic;
using System.Text;

namespace StateMachine1
{
    
class Program
    {
        
static void Main(string[] args)
        {
            TurnstileController controller = 
new TurnstileController();
            Turnstile turn = 
new Turnstile(controller);

            turn.DoEvent(Event.Coin);
            turn.DoEvent(Event.Coin);
            turn.DoEvent(Event.Pass);
            turn.DoEvent(Event.Pass);

            Console.ReadLine();
        }
    }

    
public enum State
    {
        Locked,
        Unlocked
    }

    
public enum Event
    {
        Coin,
        Pass
    }

    
public class TurnstileController
    {
        
public void Lock()
        {
            Console.WriteLine("Lock");
        }

        
public void Unlock()
        {
            Console.WriteLine("Unlock");
        }

        
public void Alarm()
        {
            Console.WriteLine("Alarm");
        }

        
public void ThankYou()
        {
            Console.WriteLine("ThankYou");
        }
    }

    
public class Turnstile
    {
        State state = State.Locked;

        
// 这个属性暴露出来是为了让测试类获取或设定十字转门的初始状态
        public State State
        {
            
get { return state; }
            
set { state = value; }
        }

        
private TurnstileController controller;

        
// 用 delegate 代替 java 的 private interface 实现
        private delegate void Action();

        
// 表示状态迁移表的一个条目
        private class Transition
        {
            
public State CurrentState;
            
public Event Event;
            
public State NewState;
            
public Action Action;

            
public Transition(State currentState, Event evt, State newState, Action action)
            {
                
this.CurrentState = currentState;
                
this.Event = evt;
                
this.NewState = newState;
                
this.Action = action;
            }
        }

        
private List<Transition> transitions = new List<Transition>();

        
public Turnstile(TurnstileController controller)
        {
            
this.controller = controller;

            
// 构造状态迁移表
            AddTransition(State.Locked, Event.Coin, State.Unlocked, new Action(controller.Unlock));
            AddTransition(State.Locked, Event.Pass, State.Locked, 
new Action(controller.Alarm));
            AddTransition(State.Unlocked, Event.Coin, State.Unlocked, 
new Action(controller.ThankYou));
            AddTransition(State.Unlocked, Event.Pass, State.Locked, 
new Action(controller.Lock));
        }

        
private void AddTransition(State currentState, Event evt, State newState, Action action)
        {
            transitions.Add(
new Transition(currentState, evt, newState, action));
        }

        
/// <summary>
        
/// 处理事件
        
/// </summary>
        
/// <param name="evt"></param>
        public void DoEvent(Event evt)
        {
            
foreach (Transition tran in transitions)
            {
                
if (state == tran.CurrentState && evt == tran.Event)
                {
                    state = tran.NewState;
                    tran.Action.Invoke();

                    
// 原书遗漏这个操作
                    break;
                }
            }
        }
    }
}

 

   
次浏览       
相关文章

一文了解汽车嵌入式AUTOSAR架构
嵌入式Linux系统移植的四大步骤
嵌入式中设计模式的艺术
嵌入式软件架构设计 模块化 & 分层设计
相关文档

企点嵌入式PHP的探索实践
ARM与STM简介
ARM架构详解
华为鸿蒙深度研究
相关课程

嵌入式C高质量编程
嵌入式操作系统组件及BSP裁剪与测试
基于VxWorks的嵌入式开发、调试与测试
嵌入式单元测试最佳实践

最新活动计划
业务架构设计与建模 4-18[北京]
DeepSeek大模型开发实践 4-19[在线]
基于 UML 和EA进行分析设计 4-26[北京]
产品经理与产品管理 5-8[上海]
AI智能化软件测试方法与实践 5-23[上海]
图数据库与知识图谱 5-22[北京]
 
 
最新文章
基于FPGA的异构计算在多媒体中的应用
深入Linux内核架构——简介与概述
Linux内核系统架构介绍
浅析嵌入式C优化技巧
进程间通信(IPC)介绍
最新课程
嵌入式Linux驱动开发
代码整洁之道-态度、技艺与习惯
嵌入式软件测试
嵌入式C高质量编程
嵌入式软件可靠性设计
成功案例
某军工所 嵌入式软件架构
中航工业某研究所 嵌入式软件开发指南
某轨道交通 嵌入式软件高级设计实践
深圳 嵌入式软件架构设计—高级实践
某企业 基于IPD的嵌入式软件开发
更多...