<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
    實(shí)現(xiàn)狀態(tài)機(jī)有多種模式,其中最靈活而強(qiáng)大的方式是通過遷移表來實(shí)現(xiàn),該方式的缺點(diǎn)之一是需要編寫大量小塊代碼去支持遷移表。而在C#3.0中,可以以一種非常優(yōu)雅的方式實(shí)現(xiàn)。
    除了有限狀態(tài)機(jī)外,還有有限自動(dòng)機(jī),有限自動(dòng)機(jī)一般用于分析字符,比如利用有限自動(dòng)機(jī)分析正則表達(dá)式
    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("門是關(guān)上的,拉了也白拉");
                //rule[State.Open][Operation.Push] = () => Console.WriteLine("門是開的,不用推了,直接進(jìn)去吧");
            }

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

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

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

        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("門是關(guān)上的,拉了也白拉");
                //rule[State.Open][Operation.Push] = () => Console.WriteLine("門是開的,不用推了,直接進(jìn)去吧");
            }

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

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

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


    網(wǎng)站導(dǎo)航:
     
    人人游戲網(wǎng) 軟件開發(fā)網(wǎng) 貨運(yùn)專家
    主站蜘蛛池模板: 啦啦啦中文在线观看电视剧免费版 | 91精品免费不卡在线观看| 全部免费国产潢色一级| 在线观看肉片AV网站免费| 男人天堂2018亚洲男人天堂| 亚洲成a人片在线观看中文app | 久久99精品国产免费观看| 亚洲AV无码专区在线电影成人| 亚洲日韩小电影在线观看| 日本亚洲国产一区二区三区| 精品久久香蕉国产线看观看亚洲| 亚洲福利视频导航| 亚洲黄网站wwwwww| 亚洲精品无码专区在线在线播放| 亚洲欧洲日产国码无码网站| 亚洲国产精品一区第二页| 亚洲第一成年男人的天堂| 亚洲综合区图片小说区| 亚洲国产综合精品一区在线播放| 在线观看视频免费完整版| 久久国产精品免费| 日韩精品无码免费专区网站| 美丽姑娘免费观看在线观看中文版| 99久久人妻精品免费一区| 性xxxxx免费视频播放| 日韩电影免费观看| 久久99久久成人免费播放| 中文字幕不卡免费视频| 337P日本欧洲亚洲大胆精品| 色噜噜亚洲男人的天堂| mm1313亚洲国产精品无码试看 | 精品国产综合成人亚洲区| 99久久亚洲综合精品成人网| 亚洲 日韩经典 中文字幕| 猫咪免费观看人成网站在线| 今天免费中文字幕视频| 18禁在线无遮挡免费观看网站| 性xxxxx免费视频播放| 亚洲?v女人的天堂在线观看| 四虎永久免费网站免费观看| 国产亚洲AV手机在线观看|