当前位置:网站首页 / C#开发 / 正文

[AYJS] wpf设计模式学习[11]-状态模式,以及对比策略模式

时间:2016年05月27日 | 作者 : aaronyang | 分类 : C#开发 | 浏览: 1189次 | 评论 0

好处:将与特定状态相关的行为局部化,并且将不同状态的行为分隔开来。

使用场景:当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。

blob.png

这次我不用WPF的例子来讲,因为状态模式适合 工作流,一个任务完成,设置下一个任务。那我们就拿游戏来讲,主线任务。

这个游戏一共3个任务:

任务1:找到AY

任务2:跟踪AY,看看他都做了什么?

任务3:回到自己的房间


每个任务完成后才能进行下一个任务:

我们来编写任务类,任务调度类

任务类:GameTask, 任务是否已经结束IsEnd,任务是否接受IsAccept,接受任务方法AcceptTask和完成任务Done

 public class GameTask
    {
        public GameTask() { }
        public GameTask(int taskId, string taskName)
        {
            this.TaskId = taskId;
            this.TaskName = taskName;
        }
        public string TaskName { get; set; }
        public int TaskId { get; set; }

        private bool isAccept = false;

        public bool IsAccept
        {
            get { return isAccept; }
        }

        private bool isEnd = false;

        public bool IsEnd
        {
            get { return isEnd; }
            set { isEnd = value; }
        }


        public virtual void AcceptTask()
        {
            this.isAccept = true;
            Console.WriteLine("任务:" + TaskName + " 已接受");
        }
        public virtual void Done(GameContext context) { }
    }

任务调度:GameContext,设置当前任务,还有个完成任务。

====================www.ayjs.net 杨洋 wpfui.com ayui ay aaronyang=======请不要转载谢谢了。=========


  public class GameContext
    {
        public GameContext(GameTask task)
        {
            this.Task = task;
        }
        private GameTask task;

        public GameTask Task
        {
            get { return task; }
            set
            {
                task = value;
                Console.WriteLine("当前主线任务:" + Task.TaskName);
            }
        }

        public void Done()
        {
            Task.Done(this);
        }

    }

接下来,我们只要添加任务即可

任务1 发现AY

  public class TaskStep1 : GameTask
    {
        public TaskStep1() { }
        public TaskStep1(int taskId, string taskName)
            : base(taskId, taskName)
        {

        }

        public override void Done(GameContext context)
        {
            if (IsAccept)
            {
                this.IsEnd = true;
                Console.WriteLine(string.Format("任务{0}:{1} 已完成!恭喜", TaskId, TaskName));
                context.Task = new TaskStep2(2, "跟踪AY,看看他都做了什么?");
            }
            else
            {
                Console.WriteLine(string.Format("任务{0}:{1} 还未接受任务,请先接受.", TaskId, TaskName));
            }
        }

    }

任务1完成后,设置任务2

 public class TaskStep2 : GameTask
        {
            public TaskStep2() { }
            public TaskStep2(int taskId, string taskName)
                : base(taskId, taskName)
            {

            }

            public override void Done(GameContext context)
            {
                if (IsAccept)
                {
                    this.IsEnd = true;
                    Console.WriteLine(string.Format("任务{0}:{1} 已完成!恭喜!!", TaskId, TaskName));
                    Console.WriteLine(string.Format("恭喜你已经升到2级!"));
                    Console.WriteLine("天啊,他这么晚睡觉,竟然还在写代码,回到房间,反思自己");
                    context.Task = new TaskStep3(3, "回到自己的房间");

                }
                else
                {
                    Console.WriteLine(string.Format("任务{0}:{1} 还未接受任务,请先接受.", TaskId, TaskName));
                }
            }
        }

任务2完成后,设置任务3

 public class TaskStep3 : GameTask
        {
            public TaskStep3() { }
            public TaskStep3(int taskId, string taskName)
                : base(taskId, taskName)
            {

            }

            public override void Done(GameContext context)
            {
                if (IsAccept)
                {
                    this.IsEnd = true;
                    Console.WriteLine(string.Format("任务{0}:{1} 已完成!恭喜", TaskId, TaskName));
                    Console.WriteLine(string.Format("你已经完成了今天所有的任务!"));
                }
                else
                {
                    Console.WriteLine(string.Format("任务{0}:{1} 还未接受任务,请先接受.", TaskId, TaskName));
                }
            }
        }

好了,如果还有其他任务,以此类推,设置一个流程

客户端代码如下: 当天任务开始时候,如果没有接受任务,问他接受,接受后就完成,然后进行下一个任务提示,但是代码只要写1个gametask.Done即可

状态模式就是定义了1个流程。

  TaskStep1 t1 = new TaskStep1(1, "找到AY");
            GameContext gametask = new GameContext(t1);
    
            do
            {
                gametask.Done();
                if (!gametask.Task.IsAccept)
                {
                    do{
                    Console.WriteLine("是否接受任务:"+gametask.Task.TaskName+"?  输入:Y/N");
                    string isaccept = Console.ReadLine();
                    if (isaccept == "Y")
                    {
                        gametask.Task.AcceptTask();
                    }
                    } while (!gametask.Task.IsAccept);
                }
            } while (!gametask.Task.IsEnd);


            Console.WriteLine("\n========本demo由www.ayjs.net的杨洋,ay编写==");
            Console.ReadKey();

效果预览:

3.gif

写到了这里,大家应该知道状态模式的具体应用了吧,感觉还是比较强大的一个模式。他的写法,与前面我们学的 策略模式很像。但是两个模式却实质解决场景不一致。


AY的讲解:策略模式侧重于算法,你是什么需求,我返回某个策略去处理你的业务。而不像状态模式给你一套流程。


关于策略模式:AY的博客:http://www.ayjs.net/post/337.html


====================www.ayjs.net       杨洋    wpfui.com        ayui      ay  aaronyang=======请不要转载谢谢了。=========




推荐您阅读更多有关于“设计模式C#,”的文章

猜你喜欢

额 本文暂时没人评论 来添加一个吧

发表评论

必填

选填

选填

必填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

  查看权限

抖音号:wpfui,可以看到我的很多作品效果

AYUI8社区版Github地址:前往获取

作者:杨洋(AaronYang简称AY,安徽六安人)目前是个人,还没公司AY唯一QQ:875556003和AY交流

高中学历,2015年1月17日开始,兴趣学习研究WPF,目前工作繁忙,不接任何活

声明:AYUI7个人与商用免费,源码可购买。部分DEMO不免费.AY主要靠卖技术服务挣钱

不是从我处购买的ayui7源码,我不提供任何技术服务,如果你举报从哪里买的,我可以帮你转正为我的客户,并送demo

查看捐赠

AYUI7.X MVC教程 更新如下:

第一课 第二课 程序加密教程

兼容XP到win10,vs2015/2017/2019,最新AYUI:7.6.5.5

vs2015 企业版密钥HM6NR-QXX7C-DFW2Y-8B82K-WTYJV

vs2017 企业版密钥NJVYC-BMHX2-G77MM-4XJMR-6Q8QF

标签列表