<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 241,  comments - 116,  trackbacks - 0
    實現狀態機有多種模式,其中最靈活而強大的方式是通過遷移表來實現,該方式的缺點之一是需要編寫大量小塊代碼去支持遷移表。而在C#3.0中,可以以一種非常優雅的方式實現。
    除了有限狀態機外,還有有限自動機,有限自動機一般用于分析字符,比如利用有限自動機分析正則表達式
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace StateMachine
    {
        class Program
        {
            static void Main(string[] args)
            {
                var door = new Door(State.Open);

                while (true)
                {
                    string s = Console.ReadLine();
                    Operation op = string.IsNullOrEmpty(s) ? Operation.Push : Operation.Pull;
                    door.Process(op);
                }
            }
        }

        enum Operation
        {
            Push, Pull
        }

        enum State
        {
            Open, Closed
        }

        class Door
        {
            public State State { get; set; }

            Dictionary<State, Dictionary<Operation, Action>> rule;
            public Door(State state)
            {
                this.State = state;

                rule = new Dictionary<State, Dictionary<Operation, Action>>();
                foreach (var e in Enum.GetValues(typeof(State)))
                {
                    rule[(State)e] = new Dictionary<Operation, Action>();
                }

                InitOperationRule();
            }

            void InitOperationRule()
            {
                //
    正常操作
                rule[State.Closed][Operation.Push] = () => { Console.WriteLine("門被推開了"); State = State.Open; };
                rule[State.Open][Operation.Pull] = () => { Console.WriteLine("
    門被拉上了"); State = State.Closed; };

                ////
    加入幾種特殊情況的處理
                //rule[State.Closed][Operation.Pull] = () => Console.WriteLine("門是關上的,拉了也白拉");
                //rule[State.Open][Operation.Push] = () => Console.WriteLine("門是開的,不用推了,直接進去吧");
            }

            public void Process(Operation op)
            {
                try
                {
                    rule[State][op]();
                }
                catch (KeyNotFoundException)
                {

                    Console.WriteLine(string.Format("
    門在{0}狀態下不允許{1}操作", State, op));
                }
                
            }
        }
    }

    從代碼中可以看到,通過lambda表達式,可以簡化遷移表的構造,并且更加直觀。
    通過遷移表構造狀態機的一種不足在于查詢速度,在本例中每個操作都要進行兩次查詢才能進行狀態轉換操作。如果狀態較多則非常費時,這里我把它改進了一下,使得每次操作只需要查詢一次即可。

        class DoorPlus
        {
            State state;
            public State State
            {
                get { return state; }
                set
                {
                    if (state != value)
                        currentOpRule = rule[value];
                    state = value;
                }
            }

            Dictionary<Operation, Action> currentOpRule;
            Dictionary<State, Dictionary<Operation, Action>> rule;
            public DoorPlus(State state)
            {
                this.State = state;

                rule = new Dictionary<State, Dictionary<Operation, Action>>();
                foreach (var e in Enum.GetValues(typeof(State)))
                {
                    rule[(State)e] = new Dictionary<Operation, Action>();
                }

                currentOpRule = rule[State];

                InitOperationRule();
            }

            void InitOperationRule()
            {
                //
    正常操作
                rule[State.Closed][Operation.Push] = () => { Console.WriteLine("門被推開了"); State = State.Open; };
                rule[State.Open][Operation.Pull] = () => { Console.WriteLine("
    門被拉上了"); State = State.Closed; };

                ////
    加入幾種特殊情況的處理
                //rule[State.Closed][Operation.Pull] = () => Console.WriteLine("門是關上的,拉了也白拉");
                //rule[State.Open][Operation.Push] = () => Console.WriteLine("門是開的,不用推了,直接進去吧");
            }

            public void Process(Operation op)
            {
                try
                {
                    currentOpRule[op]();
                }
                catch (KeyNotFoundException)
                {

                    Console.WriteLine(string.Format("
    門在{0}狀態下不允許{1}操作", State, op));
                }
            }
        }
    posted on 2008-11-25 11:55 墻頭草 閱讀(1089) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    人人游戲網 軟件開發網 貨運專家
    主站蜘蛛池模板: 91亚洲精品第一综合不卡播放| 成人性生活免费视频| 久久久青草青青国产亚洲免观| 亚洲国产成人久久精品大牛影视| 国产大片免费网站不卡美女| 亚洲视频在线不卡| 成人免费观看一区二区| 亚洲va成无码人在线观看| 免费无码AV片在线观看软件| 亚洲中文字幕无码爆乳app| 久久精品免费一区二区喷潮| 亚洲欧美自偷自拍另类视| 全免费一级午夜毛片| 亚洲AV无码专区国产乱码不卡| 四虎永久免费影院| 一区二区三区免费视频播放器 | 成年人网站免费视频| 亚洲精品美女网站| 日韩精品亚洲专区在线观看| 中文字幕无线码免费人妻| 久久精品国产亚洲av麻豆| 久热中文字幕在线精品免费| 亚洲国产欧美一区二区三区| 亚洲国产成人影院播放| 一级成人a毛片免费播放| 精品日韩99亚洲的在线发布| 免费大香伊蕉在人线国产| 中文字幕不卡免费视频| 亚洲国产午夜电影在线入口| 国产午夜鲁丝片AV无码免费 | 97国产在线公开免费观看| 亚洲综合久久精品无码色欲| 四虎永久在线精品免费观看地址| 国产亚洲精品免费视频播放| 亚洲精品网站在线观看你懂的| 成人免费淫片在线费观看| 国产一区二区三区免费观在线| 亚洲AV无码一区二区三区在线| 亚洲日韩人妻第一页| 国产1000部成人免费视频| 人妖系列免费网站观看|