文档章节

状态模式教你学会清蒸鲤鱼

白志华
 白志华
发布于 2015/10/18 10:57
字数 1239
阅读 11
收藏 0

买了九妹已经快有一年了,从经历了android2.3.5到深度优化的flyme1.1.3,风风雨雨,伴随着我一起走过。而我对魅族手机的设计也颇为留意。魅族是一个学习型的团队,很为用户考虑。今天要讲的魅族闹钟的新功能——事件定时器。以前看到了,只感觉很实用,近段时间在复习设计模式的时候,突然发现,魅族的这个新功能,尽然就是状态模式的真实实例。


为了让了解的和不了解的状态模式的同行们都看得懂我接下来说的,我先简要的介绍一下这个状态模式:


状态模式 State

       状态模式允许一个对象在其内部状态改变时改变它的行为,让对象看起来似乎修改了它的类。

       状态模式就是把系统的多个状态分割开来,分布到State的子类中,消除了庞大的分支语句,减少了耦合,同时也很容易增加新的状态的和转换。

        这就相当于一个ScheduleSchool Timetable一样,时间的改变,我们的行程或课程也随之改变。


今天借助M9的新功能,跟大家来实验一下用状态模式做一次清蒸鲤鱼,让你在学习设计模式的时候,还另有收获。别的不多说,先上图:



其中状态有5种:PrepareTime,BoillingState,SteamshState,TurnOffFishState,SaucingState,对应操作的五个步骤。

           

   

/// <summary>
    /// 制作清蒸鱼
    /// </summary>
    public class SteamFish
    {
        private State current;//存储当前状态

        public SteamFish()
        {
            current = new PrepareState();
        }

        //总计时
        private int timecount;

        //记录当前操作用时
        private int time = 0;

        public int TimeCount
        {
            get { return timecount; }
            set
            {
                //记录当前操作用时
                time = timecount;                
                timecount = value;
            }
        }

        //任务完成标识
        private bool finish = false;

        public bool TaskFinished
        {
            get { return finish; }
            set { finish = value; }
        }

        //切换状态
        public void SetState(State s)
        {            
            current = s;
        }

        //清蒸操作
        public void SteamFishes()
        {           
            //继续操作
            current.Steam(this,time);            
        }
    }


/// <summary>
    /// 抽象状态
    /// </summary>
    public abstract class State
    {
        //清蒸鱼
        public abstract void Steam(SteamFish sf,int time);
    }

/// <summary>
    /// 准备状态
    /// </summary>
    public class PrepareState : State
    {
        private static int statictime;//本状态累积所用时间(秒)

        public override void Steam(SteamFish sf, int time)
        {
            statictime += (sf.TimeCount - time);//计算本状态累积所用时间(秒)

            if (sf.TimeCount <= 60)
            {
                if (statictime == (sf.TimeCount - time))
                {
                    Console.WriteLine("\r【清蒸鱼菜谱教程】\n\n①.将少许姜、盐、麻油放入鱼腹。" + "\t\t" + "所需时间 1分0秒 ,已用去 {0}分{1}秒。\n", statictime / 60, statictime % 60);
                }
                else
                {
                    Console.WriteLine("\t\t\t\t\t亲,请稍等 ,已维持该状态 {0}分{1}秒。\n", statictime / 60, statictime % 60);
                }

            }
            else
            {
                statictime = 0;
                //下一步操作是:烧水
                sf.SetState(new BoillingState());
                sf.SteamFishes();
            }
        }
    }

/// <summary>
    /// 烧水状态
    /// </summary>
    public class BoillingState:State
    {
        private static int statictime;//本状态累积所用时间(秒)

        public override void Steam(SteamFish sf, int time)
        {
            statictime += (sf.TimeCount - time);//计算本状态累积所用时间(秒)

            if (sf.TimeCount <= 150)
            {                
                if (statictime == (sf.TimeCount - time))
                {
                    Console.WriteLine("②.往锅里放入适量的水并烧开。\t\t所需时间 1分30秒,已用去 {0}分{1}秒。\n", statictime / 60, statictime % 60);
                }
                else
                {
                    Console.WriteLine("\t\t\t\t\t亲,请稍等 ,已维持该状态 {0}分{1}秒。\n", statictime / 60, statictime % 60);
                }
            }
            else
            {
                statictime = 0;
                //下一步操作是:煮鱼
                sf.SetState(new SteamFishState());
                sf.SteamFishes();
            }
        }
    }

/// <summary>
    /// 蒸鱼状态
    /// </summary>
    class SteamFishState:State
    {
        private static int statictime;//本状态累积所用时间(秒)

        public override void Steam(SteamFish sf, int time)
        {
            statictime += (sf.TimeCount - time);//计算本状态累积所用时间(秒)

            if (sf.TimeCount <= 570)
            {
                if (statictime == (sf.TimeCount - time))
                {
                    Console.WriteLine("③.把鱼放入锅中,合上盖子。" + "\t\t" + "所需时间 7分0秒,已用去 {0}分{1}秒。\n", statictime / 60, statictime % 60);
                }
                else
                {
                    Console.WriteLine("\t\t\t\t\t亲,请稍等 ,已维持该状态 {0}分{1}秒。\n", statictime / 60, statictime % 60);
                }
            }
            else
            {
                statictime = 0;
                //下一步操作是:关火
                sf.SetState(new TurnOffState());
                sf.SteamFishes();
            }
        }
    }

/// <summary>
    /// 关火状态
    /// </summary>
    class TurnOffState:State
    {
        private static int statictime;//本状态累积所用时间(秒)

        public override void Steam(SteamFish sf,int time)
        {
            statictime += (sf.TimeCount - time);//计算本状态累积所用时间(秒)

            if (sf.TimeCount <= 870)
            {                
                if (statictime == (sf.TimeCount - time))
                {
                    Console.WriteLine("④.关火,别打开盖!" + "\t\t\t" + "所需时间 5分0秒,已用去 {0}分{1}秒。\n", statictime / 60, statictime % 60);
                }
                else
                {
                    Console.WriteLine("\t\t\t\t\t亲,请稍等 ,已维持该状态 {0}分{1}秒。\n", statictime / 60, statictime % 60);
                }
            }
            else
            {
                statictime = 0;
                //下一步操作是:烧水
                sf.SetState(new SaucingState());
                sf.SteamFishes();
            }
        }
    }

/// <summary>
    /// 调料状态
    /// </summary>
    class SaucingState:State
    {
        private static int statictime;//本状态累积所用时间(秒)

        public override void Steam(SteamFish sf, int time)
        {
            statictime += (sf.TimeCount - time);//计算本状态累积所用时间(秒)

            if (sf.TimeCount <= 880)
            {                
                if (statictime == (sf.TimeCount - time))
                {
                    Console.WriteLine("⑤.开盖,调料淋遍鱼身!" + "\t\t\t" + "所需时间 0分10秒,已用去 {0}分{1}秒。\n", statictime / 60, statictime % 60);
                }
                else
                {
                    Console.WriteLine("\t\t\t\t\t亲,请稍等 ,已维持该状态 {0}分{1}秒。\n", statictime / 60, statictime % 60);
                }
            }
            else
            {
                sf.TaskFinished = true;
                Console.WriteLine("开抢了,再不抢就没了!");
            }
        }
    }


客户端代码:
static void Main(string[] args)
        {
            //【清蒸鱼操作教程】
            SteamFish sf = new SteamFish();

            sf.TimeCount = 60;
            sf.SteamFishes();

            sf.TimeCount = 100;
            sf.SteamFishes();
            sf.TimeCount = 150;
            sf.SteamFishes();

            sf.TimeCount = 570;
            sf.SteamFishes();

            sf.TimeCount = 600;
            sf.SteamFishes();
            sf.TimeCount = 870;
            sf.SteamFishes();

            sf.TimeCount = 880;
            sf.SteamFishes();

            sf.TimeCount = 1000;
            sf.SteamFishes();

            Console.Read();
        }

效果:



版权声明:本文为博主原创文章,未经博主允许不得转载。

本文转载自:http://blog.csdn.net/xiaoxian8023/article/details/8130715

共有 人打赏支持
白志华
粉丝 31
博文 265
码字总数 57524
作品 0
长沙
程序员
私信 提问
SegmentFault 2017 年社区周报 Vol.6 粽子节快乐

5 月的最后一次小长假又开始喽 ^ ^ 你先别忙着走,看在我写了几个小时的份上,你们也来看看我的惜别语吧! 粽子节出行提醒:回家的娃,途中记得保管好自己的随身贵重物品;约妹纸/汉子的娃,出...

Jenny
2017/05/27
0
0
System76准备打造属于自家的Linux PC

有一段时间,System76 的员工曾发布他们正在进行的制造工厂的各种图片,而现在他们又在博客上分享了更多的图片。 他们正在努力实现他们在美国制造 Linux PC 的目标,最初是台式机 —— 此前他...

linux-tao
07/31
0
0
世界上最大的鲤鱼

英国《太阳报》报道,泰国的一个钓鱼专家抓到了世界上最大的鲤鱼。 这条鱼重达120公斤,7月2日在泰国的Bung Sam Lan湖中被发现。更神奇的是,它居然是23年前放生的。据报道,在此之前人类钓到...

阮一峰
2007/07/19
0
0
拉米拉:怎么样在零基础下也会操作全网营销推广?

全网营销推广贯穿于企业开展网上经营的整个过程,是一种新型的商业营销模式。主要包括信息发布、信息收集、网站建设与推广。拉米拉网络营销推广将商业理念融于互联网当中,紧密的与企业之间相...

拉米拉科技
01/03
0
0
为什么“管理的机会”没那么重要?

10月份,2shou叔做了个决定,令身边的许多朋友不解;由于习惯了做决定只凭直觉,也非常迅速完成了转换的过程,我很难向关心我的朋友表述原因(当然有一些外力的因素客观存在)。轻舟已过,再...

ershou
2017/12/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

矿难让显卡压了那么多货咋办?NV如是说

在苏州 GTC 开幕的几天前,英伟达刚刚遭遇了一次股价的腰斩。 近来加密货币的热度渐低,受到挖矿热潮照顾许多的英伟达「矿机」销量受到打击,甚至出现了严重的库存危机,加上近来刚刚发的 RT...

linux-tao
16分钟前
1
0
Python学习日记5|BeautifulSoup中find和find_all的用法

Python学习日记5|BeautifulSoup中find和find_all的用法 是蓝先生 关注 2016.04.20 11:26* 字数 930 阅读 37205评论 11喜欢 10 今天是4.20号。 前天晚上看到蒋方舟的一句话: 不要左顾右盼。慢...

linjin200
17分钟前
1
0
浅析Vue.js 中的条件渲染指令

1 应用于单个元素 Vue.js 中的条件渲染指令可以根据表达式的值,来决定在 DOM 中是渲染还是销毁元素或组件。 html: <div id="app"><p v-if="type===1">拌面</p><p v-else-if="type==...

开元中国2015
17分钟前
1
0
聊天机器人最难理解的 10 个词汇

简评:现在,越来越多的「聊天机器人」凭借着人工智能能与人类对话,甚至编写新闻。人们该如何判断对方是一个血肉之躯,还是一个可笑的算法?又该如何判断一个小说故事是由一台机器编写的,而...

极光推送
23分钟前
1
0
开源 java CMS - FreeCMS2.8会员我的评论

项目地址:http://www.freeteam.cn/ 我的评论 从左侧管理菜单点击我的评论进入。在这里可以查看当前登录会员的所有评论记录。 删除评论 选择评论然后点击删除按钮可以完成删除操作。 为了防止...

freeteam
46分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部