范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Rust学习笔记(五十二)实现一种面向对象设计模式(状态模式)

  状态模式
  状态模式(state pattern)是一种面向对象设计模式:一个值拥有的内部状态是由数个状态对象(state object)表达而成,而值的行为则随着内部状态的改变而改变。
  使用状态模式意味着: 当业务需求变化时,不需要修改持有状态的值的代码,或者使用该值的代码 只需要更新状态对象内部的代码,以便于改变其规则。或者增加一些新的状态对象
  例如有一个发布博客的工作流程: 新建博文时生成一个空白的草稿文档 在草稿编写完后可以请求对草稿进行审批 审批通过后可以对外正式发布
  并且要求只能打印返回的已经成功发布的文章,不能打印未成功发布的文章。 //src/main.rs use blog::Post;  fn main() {     let mut post = Post::new();//新建空白草稿      post.add_text("I ate a salad for lunch today");//编写博文     assert_eq!("", post.content());//未成功发布不能打印内容      post.request_review();//请求审批     assert_eq!("", post.content());//未成功发布不能打印内容      post.approve();//审批通过     assert_eq!("I ate a salad for lunch today", post.content());//审批通过,可以打印成功发布的文章 } //src/lib.rs  pub struct Post {     state: Option>,//持有文章当前状态     content: String,//文章内容 }  impl Post {     pub fn new() -> Post {//新建草稿,内容为空         Post {             state: Some(Box::new(Draft {})),             content: String::new(),         }     }      pub fn add_text(&mut self, text: &str) {//修改博文内容         self.content.push_str(text);     }     pub fn content(&self) -> &str {//因为返回的内容由状态决定,所以调用对应状态的content方法         self.state.as_ref().unwrap().content(self)     }      pub fn request_review(&mut self) {//将当前状态更新为待审批         if let Some(s) = self.state.take() {             self.state = Some(s.request_review())         }     }      pub fn approve(&mut self) {//将当前状态更新为已发布         if let Some(s) = self.state.take() {             self.state = Some(s.approve())         }     } }  trait State {     fn request_review(self: Box) -> Box;//请求审批     fn approve(self: Box) -> Box;//审批通过     fn content<"a>(&self, post: &"a Post) -> &"a str {//默认返回空字符串,因为接收的是Post的引用,返回的可能是Post中的某一部分,所以需要加生命周期         ""     }      }  //由于草稿和待审批状态不能返回内容,所以默认实现就足够了 struct Draft {}//草稿状态  impl State for Draft {     fn request_review(self: Box) -> Box {//返回待审批状态         Box::new(PendingReview {})     }      fn approve(self: Box) -> Box {//没有意义         self     } }  struct PendingReview {}//等待审批状态  impl State for PendingReview {     fn request_review(self: Box) -> Box {//因为本身就是待审批状态,所以返回自身         self     }      fn approve(self: Box) -> Box {//待审批通过,状态转为已发布         Box::new(Published {})     } }  struct Published {}//已发布状态  impl State for Published {     fn request_review(self: Box) -> Box {//没有意义         self     }      fn approve(self: Box) -> Box {//没有意义         self     }      fn content<"a>(&self, post: &"a Post) -> &"a str {//已发布状态可以返回内容,所以直接返回Post的内容         &post.content     } } 状态模式的取舍权衡
  缺点: 某些状态之间是耦合的,例如新增一个状态,就需要修改跟其相关联的状态 需要重复实现一些代码逻辑,比如request_review和approve等 将状态和行为编码为类型
  把状态和行为改为具体的类型,这样做可以:Rust类型检查系统会通过编译时错误来阻止用户使用无效的状态。例: //src/lib.rs  pub struct Post {     //发布成功的类型     content: String, }  pub struct DraftPost {     //草稿类型     content: String, }  pub struct PendingReviewPost {     //待审批类型     content: String, }  impl Post {     pub fn new() -> DraftPost {         DraftPost {             content: String::new(),         }     }      pub fn content(&self) -> &str {         &self.content     } }  impl DraftPost {     pub fn add_text(&mut self, text: &str) {         self.content.push_str(text);     }      pub fn request_review(self) -> PendingReviewPost {         PendingReviewPost {             content: self.content,         }     } }  impl PendingReviewPost {     pub fn approve(self) -> Post {         Post {             content: self.content,         }     } } //src/main.rs use blog::Post;  fn main() {   let mut post = Post::new();    post.add_text("I ate a salad for lunch today");   assert_eq!("", post.content());//因为DraftPost没有实现content方法,所以编译器报错    let post = post.request_review();   assert_eq!("", post.content());//因为PendingReviewPost没有实现content方法,所以编译器报错    let post = post.approve();    assert_eq!("I ate a salad for lunch today", post.content());  }
  所以将状态和行为编码为类型,能在写代码/编译时发现在某种状态上不该发生的行为。 总结
  Rust不仅能实现面向对象的设计模式,还可以支持更多的模式。但是面向对象的经典模式并不总是Rust编程实践的最佳选择,因为Rust具有所有权等其它面向对象语言没有的特性!所以在写Rust代码时,不要总考虑面向对象的一些概念。

微创机器人B(02252。HK)MonaLisa前列腺穿刺机器人完成多中心注册临床试验入组格隆汇5月2日丨微创机器人B(02252。HK)宣布,公司与BiobotSurgicalPte。Ltd。联合在华成立的合资公司上海介航机器人有限公司(微创介航机器人)所属产品Mon马某某被捕今天各大媒体圈把一条新闻玩坏了。标题是马某被杭州国安局采取措施这条新闻出来后立马上了热搜,而且很多人半信半疑地认为,这个马某就是那个马某。上午港股开市,阿里巴巴大跌9。4。阿里巴巴中国有多少引以为豪的世界第一,让老外们知道什么是中国速度有一个词叫中国速度,在中华人民共和国成立以来,短短70多年,不到一个世纪,中国人民从一穷二白,到许多领域,许多技术成为世界第一。让外国见识到了什么叫中国速度。大家一起来看看,我们领Al无感清凉巧遇除菌净风,云米SpaceX带来舒适一夏一个月前,我们家附近的万达新开了一家云米全屋互联家电体验馆,开业的时候去逛过,和传统的家电城不同,云米提供了一站式全屋智能场景体验,在这里,不仅能够体验到单一产品的功能,更能体验到怎么感觉,没了马云的淘宝支付宝越来越不亲民了?首先肯定一点,题主说淘宝支付宝越来越不亲民这点非常正确,这不是你个人的感觉,而是很多人的感受,其实很多人可能不明白,事实马云依旧是阿里的实际掌控者。1马云没有实际离开阿里很多人都以感觉现在小偷比以前少了,是不是因为祖国富强了,大家的生活水平提高了?是因为摄像头多了,人们的支付方式改变了。你说小偷怎么偷?一方面风险太大,偷盗过程很容易被拍下来,然后人脸识别一逮一个准!另一方面现在支付方式以电子支付为主,都不带现金的。最多就能偷马云初恋的感觉!阿里巴巴旗下平台,竟有用户倒卖文物?这个线上平台,属于马云初恋的感觉,一直以来的梦想2014年6月份,彼时的阿里巴巴公关部门高管,披露了一件如此有趣儿的内幕!人们似乎在长期被培育的认知中,一提到阿里巴巴主要创始人之一服务机器人应用技术员为机器人装上聪明的大脑三百六十行,行行出状元。当前,随着社会经济的快速发展,伴随新业态的兴起,涌现出了许多新职业,职业种类总数已远超三百六十行。与此同时,社会分工越来越细,职业兴替周期不断加速,这些因素苹果前首席设计师JonyIve离职原因曝光IT之家5月2日消息,苹果前首席设计师JonyIve于2019年离开苹果,此前他负责了这家科技巨头的许多主要产品开发。近日,在纽约时报一篇基于TrippMickle的书史蒂夫之后苹华为Mate50X曝光10倍光变5700mAh电池,妥妥的真香机在差异化越来越少的全面屏手机时代,极具辨识度和差异化的全面屏设计便成为了市场的迫切需求。大家都知道,华为手机是一家家喻户晓的国产手机厂商,是一家掌握了诸多核心技术的手机厂商,再加上华为mate50是残血版5G?搭载鸿蒙3。0系统,市场会买单吗?据坊间消息,HUAWEIMate50系列将在7月份与大家见面,而对其参数配置也是众说纷纭,有消息爆出Mate50还是4G手机,但可以通过5G手机壳实现残血版5G,那么这样的配置能否
选址日报特斯拉投366亿建超级工厂现代汽车斥334亿建生产基地特斯拉投366亿建超级工厂据最新消息,特斯拉位于印尼的电动汽车生产工厂选址已敲定,就在爪哇中部,这将是特斯拉继美国德国中国工厂之后,又一电动汽车超级工厂落地,此超级工厂的落地也将加媒体人徐亮为犯罪分子提供拨号以及短信等服务,运营公司应担责随着互联网的高速发展,近些年的电信诈骗案件频发,而在这些电信诈骗案件中存在着一个共同点,那就是骗子使用的通讯工具无法查询,这也导致了很多受害者被骗之之后报警案件无法立案,更导致了很4月快递业绩发布,申通领涨通达系,圆通跟涨5月19日,国家邮政局发布4月中国快递发展指数报告。受上海等地疫情影响,多地出现不同程度运输通道中断,行业规模有所下降。从分项指标看,快递业务量同比下降11。9,快递业务收入同比下诺基亚时尚翻盖N系老将N75大家好,这期我要领大家回忆的是,诺基亚N系列时尚翻盖手机,N75。在我的印象里,我在我的城市所有的手机商场以及诺基亚专卖店我没看到诺基亚N75的身影,应该是我所在的城市小吧,没发布苹果手机appstore应用商店限免应用(5月25日)十款限免应用白嫖指南如何获得视频中软件1用手机扫码下载所需要的app2在appstore输入软件名称查找3长按图片选择识别二维码什么是限时免费的软件限时免费是开发者将软件的价格临时调整为0元!苹果ARVR预计年底发布,机构表示长盈精密参与结构件设计市场期待已久的苹果ARVR又迎来好消息。据彭博社近日报道,苹果向董事会成员展示了其即将推出的ARVR设备,表明该设备的开发已经接近完成,并可能在不久的将来面向大众亮相。彭博社预测,盘点上半年值得入手的3款旗舰,苹果三星入选!短板屈指可数2022年上半年就快要过完了,各大品牌都发布了为今年而准备的旗舰手机,那么到现在,还有哪些手机是值得大家入手的呢?今天我们就来盘点一下。iPhone13Pro如果你预算充足,又能忍破局者强势来袭!华为打破智能门锁固有思维随着智能科技的急速发展,我们的家居生活也越来越智能化了。以前的时候,门锁需要借助钥匙来打开,现在人们更乐意选择一款智能门锁来保证家庭安全。华为智能门锁是华为针对家庭安防场景借助其在史上最牛望远镜即将开工!他能否证明霍金的预言是对的?史上最牛望远镜即将开工!他能否证明霍金的预言是对的?虽然史蒂芬霍金已经不在我们身边,但这位杰出的天体物理学家在世时的一些理论在詹姆斯韦伯太空望远镜任务中得到了验证。霍金在他去世前最汽车线控底盘行业深度报告智能电动浪潮下的千亿蓝海(报告出品方作者国海证券,刘虹辰王琭)1。乘智能电动东风,线控底盘广阔市场待开发1。1线控底盘高度匹配智能电动汽车发展线控底盘更适合电动汽车动力总成由发动机变成电池和电动机,无发动哪吒汽车又又又又搞事情了为年轻人刷新智能电动汽车上限哪吒U智哪吒V潮上市4月6日,哪吒汽车旗下两款主力产品同步迎来2022款车型上市哪吒U智和哪吒V潮,树立同级智能潮酷体验风向标。秉承哪吒汽车科技平权的价