`
caobihole
  • 浏览: 951041 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

买了九妹已经快有一年了,从经历了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();
        }

效果:



分享到:
评论

相关推荐

    关于Wireshark使用教程

    你可以把网络包分析工具当成是一种用来测量有什么东西从网线上进出的测量工具,就好像使电工用来测量进入电信的电量的电度表一样。(当然比那个更高级) 过去的此类工具要么是过于昂贵,要么是属于某人私有,或者是...

    清蒸鱼

    图形 平台与工具 语言能力 统计 :cat_face: 我的Github数据 :trophy: 2021年的28项贡献 :package: 120.4 kB用于Github的存储 :prohibited: 不选择雇用 :scroll: 10个公共存储库 :key: 14个私有存储库 ...

    抽空软包装粉蒸猪肉罐头1(食品安全企业标准).pdf

    抽空软包装粉蒸猪肉罐头1(食品安全企业标准).pdf

    FTP服务器构建软件-Serv-U+图解教程

    FTP服务器构建软件-Serv-U+图解教程

    家常菜谱----美味佳肴在家自己动手吧

    鱼 虾:糖醋带鱼、干烧鲫鱼、清蒸武昌鱼、油爆青虾。 蔬 菜:醋熘土豆丝、尖椒土豆丝、虎皮尖椒、醋溜白菜、豆干炒芹菜、麻婆豆腐、家常豆腐、 地三鲜、鱼香茄子、韭菜炒鸡蛋、干煸豆角、西红柿炒鸡蛋、鸡蛋羹、...

    餐厅点餐点菜系统,有菜单、顾客输入菜名号码,生成菜单

    map.put("06",new Dish("06","清蒸鲤鱼 ",35.0,10)); map.put("07",new Dish("07","杂酱面 ",8.0,10)); map.put("08",new Dish("08","绿豆粥 ",2.0,10)); order=new Order(username); } public void ...

    微波炉使用注意事项,微波炉怎么使用最省电

    控制面板上主要分为功能设定、时间设定、重量设定,功能设定主要是菜单,比如说清蒸鱼、蒸排骨、煮米饭等等不同的加热方式,那你在时间设定则是设置加热的时间。智能微波炉怎么使用,只需要将需要加热的食物放入...

    Java的多态(深入版)

    举个栗子,一只鸡可以做成白切鸡、豉油鸡、吊烧鸡、茶油鸡、盐焗鸡、葱油鸡、手撕鸡、清蒸鸡、叫花鸡、啤酒鸡、口水鸡、香菇滑鸡、盐水鸡、啫啫滑鸡、鸡公煲等等。 多态实现的必要条件 用上面的“鸡的十八种吃法“来...

    科大讯飞的语音合成

    #define USERWORDS @"{\"userword\":[{\"name\":\"iflytek\",\"words\":[\"德国盐猪手\",\"1912酒吧街\",\"清蒸鲈鱼\",\"挪威三文鱼\",\"黄埔军校\",\"横沙牌坊\",\"科大讯飞\"]}]}" IFlyUserWords *iFlyUserWords ...

    自己用的sql语句

    insert into t_dish_type(id, name_ch, name_en, d_code, classify_code, item_index) values ('9F59125C-6896-4BE8-8E7C-941F6CF88C3F', '清蒸类', 'Steamed dishes', '05', '10', 5) go insert into t_dish_type...

    计算机软件常用术语词典-中英

    包含几乎所有计算机软件词汇,简单易用,解释明白清楚,免安装绿色!

    Windows Server 2003 域控制器

    Windows Server 2003 域控制器  活动目录服务通过对网络中资源的信息保存到一个数据库中,来为网络中的用户和管理员提供对这些资源的访问、管理和控制。这个数据库叫活动目录数据库。通过活动目录服务,管理员可以...

    《Linux C编程实战》.(童永清).pdf带标签

    《Linux C编程实战》系统地介绍了在Linux平台下用C语言进行程序开发的过程,集趣味性、实战性于一体的160多段代码实例,帮助读者快速掌握在Linux平台下进行C语言程序开发的方法和技巧,并通过一个原创的BT软件下载...

    matlAB 图像处理 图像拼接

    matlAB 图像处理 图像拼接 可以运行带图

    精美的css3左侧竖直分类导航菜单ui特效

    精美的css3左侧竖直分类导航菜单ui特效,适用与后台管理系统,后台管理系统左侧导航栏优化和动态选中效果

    安卓2.3.6root工具

    可以一键root几乎所有motorola安卓设备。包括android2.3.6哦,亲!

    BaseDao.java

    java中Dao层中的BaseDao,适用于C#连接数据库

    基础thinkPHP5.0开发的数据管理系统

    PHP,THINKPHP5.0,数据管理

    深入理解Apache Mina

    Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便 apache mina 利的框架。当前发行的 MINA 版本支持基于 ...

    001+ 用matlab仿真ofdm调制解调系统{matlab仿真}.zip

    进行MATLAB仿真OFDM的小伙伴可以看看

Global site tag (gtag.js) - Google Analytics