状态模式教你学会清蒸鲤鱼
买了九妹已经快有一年了,从经历了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();}
效果:
状态模式教你学会清蒸鲤鱼相关推荐
- matlab如何画趋势线,【高清图解】手把手,教你学会画趋势线!
原标题:[高清图解]手把手,教你学会画趋势线! 点击标题下「每天一个K线炒股技巧」可快速关注 大家好,这里是老司机原创的股票知识:每天一个K线炒股技巧.今天的两篇文章为前面讲过的基础知识,今天来做个复 ...
- 华为手机如何固定横屏_华为手机如何录屏?原来方法这么简单,手把手教你学会...
很多人都不知道,华为手机到底如何录屏,下面给大家分享4种方法,非常简单,手把手教你学会. 一.通知栏录屏 从手机顶端往下滑动打开通知栏,这个面板上有很多快捷功能,其中就有[屏幕录制]功能,点击开始录屏 ...
- 【越好奇,越强大】伯克利研究人员使用内在激励,教AI学会好奇
你可能不记得第一次玩"超级马里奥兄弟"是什么感觉,但试着想像一下:蓝色的天空,棋盘石的地面,还有一个蹲着的红色男人在静静等待.他面向右方,你把他推到那个方向.再多走几步,就会看到一 ...
- 【转载】教你学会看写 input 文件
教你学会看&写 input 文件 阅读指导 https://www.jianshu.com/p/8c4d45b089b6#fnref7 本文将会涉及到以下内容: inp 文件的功能和作用(你是 ...
- 电脑录屏工具_一分钟教你学会两种电脑录屏的方法,以后别再说不知道了
相信大家用电脑都会截图,但有时候需要用到录屏,这就难倒了很多人.那么如何在电脑是录屏呢?下面就来教你学会两种电脑录屏的方法,以后别再说不知道了. 阅读引导: •阅读完本文预计需要2分钟时间. •本文是 ...
- GitChat · 软件工程 | 一小时教你学会 Maven 项目的构建与管理
GitChat 作者:梁鹏举 原文: 一小时教你学会 Maven 项目的构建与管理 关注公众号:GitChat 技术杂谈,一本正经的讲技术 Maven翻译成中文是"专家.内行".M ...
- 不求人,手把手教你学会微信WIFI!
前言:好吧,这是作者开博的第一篇文章,在如今朋友圈文章泛滥的时代,再看过了那么多"心灵鸡汤"."技术神贴"之后,作者也在思考,自己能不能写点什么,也许过上一百年 ...
- Java进阶篇设计模式之十二 ---- 备忘录模式和状态模式
前言 在上一篇中我们学习了行为型模式的策略模式(Strategy Pattern)和模板模式(Template Pattern).本篇则来学习下行为型模式的两个模式,备忘录模式(Memento Pat ...
- 设计模式 状态模式 以自动售货机为例
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/26350617 状态模式给了我眼前一亮的感觉啊,值得学习~ 先看定义:允许对象在内 ...
最新文章
- vsftpd实现的FTP服务
- mysql数据库的触发器_Mysql数据库触发器
- Power BI for Office 365(八)共享查询
- fastclick库的介绍和使用
- 【Java】JScrollPane的内容显示与刷新问题
- 清华附2021高考成绩查询,2021年高考多少分能上清华大学?附清华大学录取分数线2020全国汇总...
- 千万别从网页复制粘贴命令
- ubuntu16.04 apt-get update出错:由于没有公钥,无法验证下列签名
- 路由器接口为啥不能配置为任意播地址_计算机三级网络技术(7):路由器配置及使用(下)...
- Android中Intent传递Java对象的方法
- 【MySQL高性能】Canal数据同步神器
- Postman 中文包使用
- 【晓松奇谈】历史是什么,人生是什么,世界是什么,未来是什么?高晓松的回答
- 现在,您可以在YouTube上播放免费的,广告支持的电影
- 计算机EV录屏培训体会,ev录屏不能录制声音怎么办?对照原因进行解决
- Presto 在美图的实践
- c语言 m个数 取n个数,本题要求编写程序,根据公式Cnm=m!(n−m)!n!算出从n个不同元素中取出m个元素(m≤n)的组合数。...
- 5种方法快速定位对方IP
- 学习英文-学以致用【场景:看美剧】
- 什么是撞库?如何预防撞库攻击
热门文章
- 局域网(LAN)端口与广域网(WAN/外网)端口映射——实现让局域网机器在外网做服务器...
- 程序员自我提升的5个方法
- 如何在Java中转换Excel文件到图像?
- 教你文件重命名快速操作
- 解决Windows10电脑时间不同步或无法更新问题
- C51与4*4矩阵键盘
- html+js+canvas实现画板涂画功能和vue+canvas实现画板涂画功能
- 前端之路之mac PS的安装破解
- 我的mybatis plus——全公司同事开始模仿了!
- python数据入库_python爬虫(中)--数据建模与保存(入库)