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

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

状态模式 State

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

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

这就相当于一个Schedule或School 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();}

效果:

状态模式教你学会清蒸鲤鱼相关推荐

  1. matlab如何画趋势线,【高清图解】手把手,教你学会画趋势线!

    原标题:[高清图解]手把手,教你学会画趋势线! 点击标题下「每天一个K线炒股技巧」可快速关注 大家好,这里是老司机原创的股票知识:每天一个K线炒股技巧.今天的两篇文章为前面讲过的基础知识,今天来做个复 ...

  2. 华为手机如何固定横屏_华为手机如何录屏?原来方法这么简单,手把手教你学会...

    很多人都不知道,华为手机到底如何录屏,下面给大家分享4种方法,非常简单,手把手教你学会. 一.通知栏录屏 从手机顶端往下滑动打开通知栏,这个面板上有很多快捷功能,其中就有[屏幕录制]功能,点击开始录屏 ...

  3. 【越好奇,越强大】伯克利研究人员使用内在激励,教AI学会好奇

    你可能不记得第一次玩"超级马里奥兄弟"是什么感觉,但试着想像一下:蓝色的天空,棋盘石的地面,还有一个蹲着的红色男人在静静等待.他面向右方,你把他推到那个方向.再多走几步,就会看到一 ...

  4. 【转载】教你学会看写 input 文件

    教你学会看&写 input 文件 阅读指导 https://www.jianshu.com/p/8c4d45b089b6#fnref7 本文将会涉及到以下内容: inp 文件的功能和作用(你是 ...

  5. 电脑录屏工具_一分钟教你学会两种电脑录屏的方法,以后别再说不知道了

    相信大家用电脑都会截图,但有时候需要用到录屏,这就难倒了很多人.那么如何在电脑是录屏呢?下面就来教你学会两种电脑录屏的方法,以后别再说不知道了. 阅读引导: •阅读完本文预计需要2分钟时间. •本文是 ...

  6. GitChat · 软件工程 | 一小时教你学会 Maven 项目的构建与管理

    GitChat 作者:梁鹏举 原文: 一小时教你学会 Maven 项目的构建与管理 关注公众号:GitChat 技术杂谈,一本正经的讲技术 Maven翻译成中文是"专家.内行".M ...

  7. 不求人,手把手教你学会微信WIFI!

    前言:好吧,这是作者开博的第一篇文章,在如今朋友圈文章泛滥的时代,再看过了那么多"心灵鸡汤"."技术神贴"之后,作者也在思考,自己能不能写点什么,也许过上一百年 ...

  8. Java进阶篇设计模式之十二 ---- 备忘录模式和状态模式

    前言 在上一篇中我们学习了行为型模式的策略模式(Strategy Pattern)和模板模式(Template Pattern).本篇则来学习下行为型模式的两个模式,备忘录模式(Memento Pat ...

  9. 设计模式 状态模式 以自动售货机为例

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/26350617 状态模式给了我眼前一亮的感觉啊,值得学习~ 先看定义:允许对象在内 ...

最新文章

  1. vsftpd实现的FTP服务
  2. mysql数据库的触发器_Mysql数据库触发器
  3. Power BI for Office 365(八)共享查询
  4. fastclick库的介绍和使用
  5. 【Java】JScrollPane的内容显示与刷新问题
  6. 清华附2021高考成绩查询,2021年高考多少分能上清华大学?附清华大学录取分数线2020全国汇总...
  7. 千万别从网页复制粘贴命令
  8. ubuntu16.04 apt-get update出错:由于没有公钥,无法验证下列签名
  9. 路由器接口为啥不能配置为任意播地址_计算机三级网络技术(7):路由器配置及使用(下)...
  10. Android中Intent传递Java对象的方法
  11. 【MySQL高性能】Canal数据同步神器
  12. Postman 中文包使用
  13. 【晓松奇谈】历史是什么,人生是什么,世界是什么,未来是什么?高晓松的回答
  14. 现在,您可以在YouTube上播放免费的,广告支持的电影
  15. 计算机EV录屏培训体会,ev录屏不能录制声音怎么办?对照原因进行解决
  16. Presto 在美图的实践
  17. c语言 m个数 取n个数,本题要求编写程序,根据公式Cnm=m!(n−m)!n!算出从n个不同元素中取出m个元素(m≤n)的组合数。...
  18. 5种方法快速定位对方IP
  19. 学习英文-学以致用【场景:看美剧】
  20. 什么是撞库?如何预防撞库攻击

热门文章

  1. 局域网(LAN)端口与广域网(WAN/外网)端口映射——实现让局域网机器在外网做服务器...
  2. 程序员自我提升的5个方法
  3. 如何在Java中转换Excel文件到图像?
  4. 教你文件重命名快速操作
  5. 解决Windows10电脑时间不同步或无法更新问题
  6. C51与4*4矩阵键盘
  7. html+js+canvas实现画板涂画功能和vue+canvas实现画板涂画功能
  8. 前端之路之mac PS的安装破解
  9. 我的mybatis plus——全公司同事开始模仿了!
  10. python数据入库_python爬虫(中)--数据建模与保存(入库)