Rust学习笔记(五十二)实现一种面向对象设计模式(状态模式
状态模式
状态模式(statepattern)是一种面向对象设计模式:一个值拥有的内部状态是由数个状态对象(stateobject)表达而成,而值的行为则随着内部状态的改变而改变。
使用状态模式意味着:当业务需求变化时,不需要修改持有状态的值的代码,或者使用该值的代码只需要更新状态对象内部的代码,以便于改变其规则。或者增加一些新的状态对象
例如有一个发布博客的工作流程:新建博文时生成一个空白的草稿文档在草稿编写完后可以请求对草稿进行审批审批通过后可以对外正式发布
并且要求只能打印返回的已经成功发布的文章,不能打印未成功发布的文章。srcmain。rsuseblog::Post;fnmain(){letmutpostPost::new();新建空白草稿post。addtext(Iateasaladforlunchtoday);编写博文asserteq!(,post。content());未成功发布不能打印内容post。requestreview();请求审批asserteq!(,post。content());未成功发布不能打印内容post。approve();审批通过asserteq!(Iateasaladforlunchtoday,post。content());审批通过,可以打印成功发布的文章}srclib。rspubstructPost{state:OptionBoxdynState,持有文章当前状态content:String,文章内容}implPost{pubfnnew()Post{新建草稿,内容为空Post{state:Some(Box::new(Draft{})),content:String::new(),}}pubfnaddtext(mutself,text:str){修改博文内容self。content。pushstr(text);}pubfncontent(self)str{因为返回的内容由状态决定,所以调用对应状态的content方法self。state。asref()。unwrap()。content(self)}pubfnrequestreview(mutself){将当前状态更新为待审批ifletSome(s)self。state。take(){self。stateSome(s。requestreview())}}pubfnapprove(mutself){将当前状态更新为已发布ifletSome(s)self。state。take(){self。stateSome(s。approve())}}}traitState{fnrequestreview(self:BoxSelf)BoxdynState;请求审批fnapprove(self:BoxSelf)BoxdynState;审批通过fncontenta(self,post:aPost)astr{默认返回空字符串,因为接收的是Post的引用,返回的可能是Post中的某一部分,所以需要加生命周期}}由于草稿和待审批状态不能返回内容,所以默认实现就足够了structDraft{}草稿状态implStateforDraft{fnrequestreview(self:BoxSelf)BoxdynState{返回待审批状态Box::new(PendingReview{})}fnapprove(self:BoxSelf)BoxdynState{没有意义self}}structPendingReview{}等待审批状态implStateforPendingReview{fnrequestreview(self:BoxSelf)BoxdynState{因为本身就是待审批状态,所以返回自身self}fnapprove(self:BoxSelf)BoxdynState{待审批通过,状态转为已发布Box::new(Published{})}}structPublished{}已发布状态implStateforPublished{fnrequestreview(self:BoxSelf)BoxdynState{没有意义self}fnapprove(self:BoxSelf)BoxdynState{没有意义self}fncontenta(self,post:aPost)astr{已发布状态可以返回内容,所以直接返回Post的内容post。content}}状态模式的取舍权衡
缺点:某些状态之间是耦合的,例如新增一个状态,就需要修改跟其相关联的状态需要重复实现一些代码逻辑,比如requestreview和approve等将状态和行为编码为类型
把状态和行为改为具体的类型,这样做可以:Rust类型检查系统会通过编译时错误来阻止用户使用无效的状态。例:srclib。rspubstructPost{发布成功的类型content:String,}pubstructDraftPost{草稿类型content:String,}pubstructPendingReviewPost{待审批类型content:String,}implPost{pubfnnew()DraftPost{DraftPost{content:String::new(),}}pubfncontent(self)str{self。content}}implDraftPost{pubfnaddtext(mutself,text:str){self。content。pushstr(text);}pubfnrequestreview(self)PendingReviewPost{PendingReviewPost{content:self。content,}}}implPendingReviewPost{pubfnapprove(self)Post{Post{content:self。content,}}}srcmain。rsuseblog::Post;fnmain(){letmutpostPost::new();post。addtext(Iateasaladforlunchtoday);asserteq!(,post。content());因为DraftPost没有实现content方法,所以编译器报错letpostpost。requestreview();asserteq!(,post。content());因为PendingReviewPost没有实现content方法,所以编译器报错letpostpost。approve();asserteq!(Iateasaladforlunchtoday,post。content());}
所以将状态和行为编码为类型,能在写代码编译时发现在某种状态上不该发生的行为。总结
Rust不仅能实现面向对象的设计模式,还可以支持更多的模式。但是面向对象的经典模式并不总是Rust编程实践的最佳选择,因为Rust具有所有权等其它面向对象语言没有的特性!所以在写Rust代码时,不要总考虑面向对象的一些概念。
你认为画画是为了什么?谢谢邀请。作为一个艺术工作者,我深刻地感受到,我画画就是为心中的信念。我自小喜欢涂鸦,后来学习绘画,自认为是当今艺考生的老前辈,骨灰级的最初的艺考生。上了美术专业学校,从……
工信部2月末5G移动电话用户较上年末净增2905万户中新经纬3月21日电工信部网站21日发布2022年12月份通信业经济运行情况。12月份,电信业务收入累计完成2586亿元,同比增长9,增速同比提升3。2个百分点。截至2月份末,……
贺兰山网评解开被算法绑架的我们3月17日下午,在国务院新闻办公室举行的清朗系列专项行动新闻发布会上,国家网信办副主任盛荣华具体介绍了关于2022年清朗活动包括的10个方面重点任务。其中,将于近期启动的清朗算……
美国特斯拉官宣涨价,Model3起售27万元据特斯拉美国官网消息,特斯拉对Model3Y的价格进行上调。其中,Model3标准续航版和高性能版均上调1000美元(约合人民币6445元),现在售价为4。199万美元和5。7……
华为手机拍照片怎么加上自己的字和二维码?如何在手机上添加自己的标志。感谢邀请。发现更多精彩功能,请访问玩机技巧应用。这里就以华为手机为例,讲述一下如何在手机拍摄的照片上添加自己的标志来和网络上或其他来源的……
升级win11后显示器四周有1mm黑边,怎么解决?这个貌似是液晶屏的封装边吧,应该本来就有的,可能是你一直没有注意,一般的显示器都有这个黑边。如果真的确定之前没有那应该是分辨率没有正确设置对,或者是显卡的驱动没有正确安装好,最……
如果微信从下月开始收费,每月10元,你还会用吗?如果微信收费,并且每月十元,我会即刻把它给卸了。从实用价值来说:微信已经不是必须的,唯一东西。而且堆了太多没用的功能,太占内存。考虑是正在使用当中,还是免费,否则是不会选……
C组件开发PLC通讯由于本人是一名小电工做起代码可能写的不够完善请各位大佬谅解。本项目主要是通过。NETCore3。1框架进行开发主要用于工业控制方面通过自定义控件继承接口并且实现该接口就可以很好……
新电商研究报告发布,北京成新电商独角兽最活跃地新京报讯(记者秦胜南)10月9日,首届中国新电商大会发布《新电商研究报告》,其中提到,当前中国电商独角兽约占据全球半壁江山,汽车、生鲜类电商备受资本青睐,北京成新电商独角兽最活……
中概互联真的能抄底吗中概互联今年已经基本腰斩了,市值已经回到3年前水平,并且市盈率也是历史很低,一波波看起来已经接近于底部,看起来是相当诱人,忍不住想抄底一波,但是真的能抄底吗?首先来看,中……
马云到底有几个孩子?为什么他的孩子都从来没有露过面?马云有两个孩子,一儿一女,儿子是老大,女儿老二。因为他不想让家人抛头露面,他想保护好家人,这有什么值得质疑的。不要用片面的眼光看一个人,马云还是做了一些为人民服务、为社会进步的……
运算符之三比较运算符运算符之三:比较运算符!instanceof结论:1。比较运算符的结果是boolean类型2。区分和classCompareTest{pub……
地球内部是什么?简单来说,地球内部就是岩石,越往里越是高温高压,甚至是软流层或者液态。具体来说,地球内部分有很多层,这就是常说的圈层结构。著名地球物理学家莫霍洛维奇和古登堡分别通过研究地震波发……
微信断腕,谁的福音图片来源视觉中国文丨零态LT(ID:LingTaiLT),作者丨江城子,编辑丨胡展嘉在潺潺流水和慢慢船歌中,乌镇迎来了2021年世界互联网大会。这里云集了国内外的大……
近些年来为啥家电超市少见DVD机了?都什么年代了,所有的信息都网络共享了,电视直接联网,根本用不着DVD机了。谢谢邀请,随着电子科技技术及我国互联网的飞速发展,近十年来数码家电产品发生了翻天覆地的变化,特别……
新能源汽车充电时长跟用的10a和16a插头有关吗新能源汽车充电时长跟用的10a和16a插头有关。慢充是电动汽车最安全、最常规的充电方式,也就是交流充电,充电过程普遍需要68小时。买车送的这个随车充电器是10A插头的,实……
你用过的你哪个手机最坑?从2002年到现在,使用了很多手机,下面就是我能想起来的手机,有的只记住了品牌,型号就忘了,它们依次是:波导手机,南方高科,小灵通,摩托罗拉,诺基亚3250,摩托罗拉ME865……
美国上市公司由第三方审计作为公司状况的顾问是否具有可借鉴性?第三方审计工作是由具备资质的会计师所进行审计,那么所谓的第三方,就是中立的一方,注册会计师正好具备这个特点。因为第三方具有中立的特点,所以在对上市公司做审计工作的同时可以做到公……
互联网培训机构是鸡肋吗?个人认为不是的,身边有很多朋友都在培训机构里学习过,了解和咨询后才明白,机构里会有很多大牛,互联网大咖会寻找一些新的知识点和框架进行分享给授课的老师们,让每一批的学员都学的是最……
中方对大型互联网科技公司的监管是否意味着对外开放政策调整?中中国驻英国大使馆网站10月8日消息,驻英国使馆发言人就中国坚定不移扩大对外开放答记者问,全文如下:(一)记者:一段时间以来,中国采取了加强对互联网平台等大型科技企业监管、……
小红书就滤镜景点致歉部分用户存在过度美化笔记三言财经10月17日消息,针对网友吐槽小红书上滤镜景点一事,小红书今日发文致歉。小红书称,部分用户在分享过程中的确存在过度美化笔记的情况。大部分都属于旅拍美图,但由于分享……
创新引领发展国产手机厂商打造科技范儿按下千分之一秒的快门,定格四年芳华;让有听音障碍的妈妈听见婴儿的哭声,更好地照顾孩子;通过最新技术修复《庐山恋》,并将其清晰度提升到了4K级别;运用图声文档化的能力,快速将图声……
用比特币支付股权转让款,违反法律规定应为无效股权转让中,股权转让款除了用货币支付,还可以用土地使用权、房屋所有权、知识产权等有财产进行支付,还有有部分股东选择用比特币等虚拟货币进行交易。在用比特币交易的情况下,随着国家对……
小米之后滴滴也要入局?科技公司加速造车进程科技公司正在加速进入造车阵营。4月6日,据《晚点LatePost》报道,其从多个独立信源处获悉,滴滴开始启动造车项目,负责人是滴滴副总裁、小桔车服总经理杨峻,同时滴滴已从……