<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 墻頭草 閱讀(1087) 評論(0)  編輯  收藏

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


    網站導航:
     
    人人游戲網 軟件開發網 貨運專家
    主站蜘蛛池模板: 免费羞羞视频网站| 免费在线观看亚洲| 一级特黄录像免费播放肥| 亚洲youjizz| 亚洲成人午夜在线| 亚洲中文字幕无码一区| 波多野结衣一区二区免费视频 | 免费观看黄色的网站| 国产精品无码免费专区午夜| 一个人看的www免费高清| 亚洲精品456人成在线| 国产AV无码专区亚洲AV男同| 久久久久亚洲av毛片大| 亚洲M码 欧洲S码SSS222| 成人五级毛片免费播放| 成人毛片18女人毛片免费视频未| 国内精品免费麻豆网站91麻豆| 国产一级片免费看| 午夜视频免费在线观看| 日本免费一区二区三区| 亚洲成年人免费网站| 国产成人无码免费看视频软件 | 亚洲va无码手机在线电影| 久久被窝电影亚洲爽爽爽| 亚洲AV午夜成人片| 亚洲黄色一级毛片| 亚洲国产精品成人综合色在线| 亚洲精品免费网站| 久香草视频在线观看免费| 精品视频在线免费观看| 黄+色+性+人免费| 亚洲黄片手机免费观看| 亚洲国产成人久久精品动漫| 色拍自拍亚洲综合图区| 亚洲风情亚Aⅴ在线发布| jizz免费在线观看| 日韩版码免费福利视频| 亚洲人成无码网WWW| 精品亚洲456在线播放| 国产一级高青免费| 日本免费网站观看|