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

七爪源码学习Memento设计模式

  Memento 是一种行为设计模式,可让您保存和恢复对象的先前状态,而无需透露其实现的细节。
  假设您正在创建一个文本编辑器应用程序。除了编写文本之外,文本编辑器的基本要求之一是能够撤消所做的更改。
  因此,您决定使用直接实现,在该实现中,在执行任何操作之前,应用程序会记录所有对象的状态并将其存储在某处。因此,当用户决定恢复操作时,应用程序会从历史记录中检索最新的快照。
  对象中所有字段的值都需要复制到存储中。但是,这只有在对象放宽对其内容的访问限制时才有可能,而现实生活中并非如此。
  Memento 设计模式
  损坏的封装是我们刚刚遇到的问题的原因。对象有时会尝试做比他们应该做的更多的事情。为了收集执行特定操作所需的数据,它们会侵入其他对象的私有空间,而不是让这些对象执行操作。
  Memento 模式将创建状态快照的责任委托给状态的实际所有者,即创建者对象。因此,其他对象不应该尝试复制编辑器的状态。
  该模式建议将对象状态的副本存储在特殊的纪念品中。纪念品的内容只能由产生它的对象访问。 Mementos 必须通过有限的接口与其他对象通信,该接口允许获取快照的元数据,但不能获取原始对象的状态。
  在这种限制性政策下,纪念品可以存储在其他对象中,通常称为看守者。看守者对纪念品的访问权限有限,因此它无法更改其状态。同样,发起者可以访问备忘录中的所有字段,允许它随意恢复其先前的状态。
  在实现撤销时,命令和备忘录设计模式可以一起使用。命令负责对目标对象执行各种操作,而备忘录在命令执行之前记录该对象的状态。
  UML 类图
  实施步骤确定哪个类将是发起者。了解程序是使用一个中心对象还是许多较小的对象至关重要。创建一个名为 Memento 的类。一个一个地声明一组与 originator 类中的字段相对应的字段。使内存类不可变。 Mementos 应该只通过构造函数接受一次数据。该类不应该有二传手。如果您的编程语言支持嵌套类,则将备忘录嵌套在创建者中。如果没有,则从 memento 类中提取一个空白接口,并让所有其他对象使用它来引用 memento。您可能会向接口添加一些元数据操作,但不能添加任何暴露发起者状态的操作。向创建者类添加一个方法来制作纪念品。发起者应通过一个或多个参数将其状态传递给备忘录的构造函数。该方法的返回类型应该是您在上一步中提取的接口的返回类型。 memento-production 方法应该直接与 memento 类一起使用。添加一个用于将创建者的状态恢复到类的方法。该方法应该接受一个纪念品对象作为参数。如果您在上一步中提取了接口,请将其设为参数。因为发起者需要访问传入的对象,所以需要进行类型转换。不管看守者是代表命令对象、历史还是完全不同的东西,它都应该知道何时向发起者请求新的纪念品,如何存储它们,以及何时用特定的纪念品恢复发起者。我们可以将看守者和发起者之间的链接移到纪念品类中。因此,每个纪念品都必须与创建它的创建者相关联。恢复也将转移到纪念品类。只有当 memento 类嵌套在 originator 类中或者 originator 类提供了足够的 setter 来覆盖其状态时,这一切才有意义。
  源代码实现
  需要时,Editor (Originator) 类可以创建其自身状态的快照以及从快照中恢复其状态。
  Memento 是一个值对象,充当发起者当前状态的快照。使备忘录不可变并且只通过构造函数传递一次数据是很常见的。package com.learncsdesign;  public class Editor { 	private String text; 	private int cursorX; 	private int cursorY; 	private int selectionWidth;  	public void setText(String text) { 		this.text = text; 	}  	public String getText() { 		return text; 	}  	public void setCursor(int cursorX, int cursorY) { 		this.cursorX = cursorX; 		this.cursorY = cursorY; 	}  	public void setSelectionWidth(int selectionWidth) { 		this.selectionWidth = selectionWidth; 	}  	public Snapshot save() { 		return new Snapshot(text, cursorX, cursorY, selectionWidth); 	}  	public void restore(Snapshot snapshot) { 		setText(snapshot.getText()); 		setCursor(snapshot.getCursorX(), snapshot.getCursorY()); 		setSelectionWidth(snapshot.getSelectionWidth()); 	}  	class Snapshot { 		private final String text; 		private final int cursorX; 		private final int cursorY; 		private final int selectionWidth;  		private Snapshot(String text, int cursorX, int cursorY, int selectionWidth) { 			this.text = text; 			this.cursorX = cursorX; 			this.cursorY = cursorY; 			this.selectionWidth = selectionWidth; 		}  		public String getText() { 			return text; 		}  		public int getCursorX() { 			return cursorX; 		}  		public int getCursorY() { 			return cursorY; 		}  		public int getSelectionWidth() { 			return selectionWidth; 		}  	} }
  除了知道何时以及为什么要捕获发起者的状态之外,看守者还知道何时恢复它。 看守者可以通过存储纪念品来跟踪发起者的历史。 当发起者必须及时返回时,看守者从堆栈中检索最顶部的 memento 并将其传递给发起者的恢复方法。package com.learncsdesign;  import java.util.Stack;  import com.learncsdesign.Editor.Snapshot;  public class CareTaker { 	private static Stack snapshots = new Stack();  	private static void doBackup(Editor editor) { 		snapshots.push(editor.save()); 	}  	private static void undo(Editor editor) { 		if (!snapshots.isEmpty()) { 			editor.restore(snapshots.pop()); 		} 	}  	public static void main(String[] args) { 		Editor editor = new Editor(); 		editor.setText("Hello World!"); 		System.out.println("Editor text: " + editor.getText()); 		doBackup(editor); 		editor.setText("Hello Medium!"); 		System.out.println("Editor modified text: " + editor.getText()); 		undo(editor); 		System.out.println("Editor Restored text: " + editor.getText()); 	} }
  memento 类嵌套在这个实现中的 originator 类中。发起者可以访问备忘录的字段和方法,即使它们已被声明为私有。尽管如此,看守者对纪念品的字段和方法的访问非常有限,这允许它在不改变其状态的情况下将纪念品存储在堆栈上。
  何时应用 Memento 设计模式当您需要创建对象状态的快照以便能够将其恢复到以前的状态时,请使用 Memento 模式。每当直接访问对象的字段违反其封装时,请使用此模式。 Memento 使对象本身负责拍摄其状态的快照。快照不能被任何其他对象读取,因此原始对象的状态数据是安全可靠的。
  Memento 设计模式的优点可以在不违反其封装的情况下创建对象状态的快照。让看守者维护发起者状态的历史,以便简化发起者的代码。
  如果你喜欢这篇文章,你知道该怎么做
  关注七爪网,获取更多APP/小程序/网站源码资源!

梦中崆峒山(图片来之网友)我曾经做过一个梦,梦中我来到崆峒山,山上森林茂密,古木参天,大殿林立,紫红色的砾石山崖在太阳的照射下闪闪发光。我站在山顶,慷慨激昂,滔滔不绝,下面听我演讲的人不计其基本全了,iPhone14再无秘密,全系亮点都在这关注犟牛,不错过每一篇好文。根据海外博主theapplehub的爆料,基于过去两年的市场表现,iPhone系列的mini机型不论在销量,还是口碑上都没有达到公司的预期。今年,苹果公保姆级NASblack群晖搭建教程在尝鲜或者说安装黑群晖前,你必须要有一台X86的电脑,不管你是闲置的笔记本台式机各种工控小主机也罢,都是可以的。我本期使用这台J1800处理器的小主机,当时在海鲜市场100来块收的比贫穷更可怕的是无休止的内耗你知道一个从小到大,都生活在父母无休止的争吵环境里有多崩溃吗?我家是农村的,家里一共四个孩子。小时候家里特别穷,日子过得紧巴巴,穿的衣服都是姐姐穿过的,再轮到我们穿,上学的学费都需老年之后的夫妻生活,一般都是这样的前言老年之后,有些人觉得很幸福,有些人觉得日子很烦躁,还有些人觉得活在这个世界上就没有意义,其实每个人都有不同的生活方式,由于生长在不同的生活环境,可能每个人的想法和感受不一样,因隔夜水还能喝吗?大部分人的知识盲区一般情况下隔夜水是可以喝的,但一定要在第二天就饮用完,避免再次隔夜。另外,隔夜水的保存也有要求,如果是放置在没有盖子或水垢较多的杯子水壶等容器中,以及灰尘较多闷热的环境中,不建议隔舌有裂纹,除了是阴虚,还要注意是气虚中医理论大多来自人对自然的思考取象,上观天文中知人情下知地理,如果说齿痕舌是气虚气亏虚,在自然界中就好像是亏气的气球萎缩了,那裂纹舌则像干涸的农田一样干裂。阴虚干裂多是因为阴虚,阴华为WATCHGT3Pro手表推送2。1。0。327更新IT之家5月7日消息,华为WATCHGT3Pro手表开始推送HarmonyOS2。1。0。327更新,下载包大小为112MB。支持微信支付新增iOS手机支持钱包交通卡和音乐控制功能桑树条子从小抈桑条从小抈(育),大来抈不直,意思是桑树的枝条要想培直,必须在它嫩小的时候抈,长成粗枝便无法抈动。教育后代更是如此,对于孩子必须从小抓起,方能收到良好的效果。如今的孩子娇生惯养,凡高钙牛奶不补钙,3岁前千万别给孩子喝,家长别再躺枪了1岁以上的孩子,渐渐实现了从奶粉到牛奶的过渡,每天至少一瓶奶成为不少家庭每日必须完成的KPI。但由于市场上牛奶产品琳琅满目,家长们往往都是凭着感觉买,或者跟着孩子的口味选,选择很明这种性格的孩子,注定了将来难有出息,希望你家孩子不是这种性格的孩子,注定了将来难有出息,希望你家孩子不是那天闺蜜约我逛街,于是我们就一起带着孩子出去玩,最后来到了一个儿童游乐场,两个孩子都吵着要玩攀岩,结果就看到这样一幕。两个五六岁
东契奇三节打卡下班击败西部第一的太阳队,谁都敢赢,谁都敢输啊北京时间12月6日,NBA常规赛,太阳队对阵独行侠队,本场比赛,独行侠队占据着绝对的优势,上半场就领先了26分之多,要知道,他们面对的可是西部战绩第一的太阳队,能够打出如此强势的表发电不放过一丝一毫,宝马申请新型太阳能电池板专利日前据外媒报道,宝马向德国专利商标局(DPMA)申请了一项新专利一种将超薄太阳能电池板放置在汽车外玻璃板的全新方法,有望提高发电效率并大大减少车辆内光的进入。该技术或将首次应用于宝加福德湖人很好地利用了浓眉的火热手感那记扣篮是对我的奖励直播吧12月5日讯NBA常规赛,奇才119130不敌湖人。赛后,奇才球员加福德接受了采访。谈到湖人时,加福德表示我认为他们很好地利用了戴维斯的火热手感,他从一开始就很专注,这让我们任天堂大乱斗电竞争议Panda总裁免职决赛延期此前我们曾报道,任天堂全明星大乱斗玩家社区组织的最大电竞赛事组织者SmashWorldTour宣布,因任天堂要求,即将举办的比赛将不得不被迫取消。SWT组织者称,另外一家与任天堂正欧洲共享电网面临崩溃险境,多国计划限制电力出口环球时报综合报道今年冬天,依靠共享电网的欧洲或将面临严峻电力危机。英国路透社12月4日报道称,法国总统马克龙呼吁居民减少使用能源,并重启核电站防止停电。据英国金融时报报道,未来几个为保持CLO市场运转欧洲银行纷纷自掏腰包购买自家产品智通财经APP获悉,在传统上占买方大部分的美国和日本银行缺席的情况下,欧洲银行目前正在抢购大量自家的抵押贷款证券(CLO),以维持该市场的正常运转。法兴银行(SCGLY。US)在1上海新添一座绿地巨无霸,相当于26座世纪公园,市民很期待如今社会发展进行得非常快速,不论是工作了的人还是在上学的人,他们都有各自的烦恼和焦虑,很多人们都想从自己每天固有的生活中逃出来,收拾行囊,来一次说走就走的旅行。我们经常在自己的朋友上天的水稻回来了!它们在太空完成了国际上首次全生命周期培养实验白浪设计那些上天的水稻种子,又结出种子回来了!北京时间2022年12月4日20时09分,神舟十四号载人飞船返回舱在东风着陆场成功着陆。澎湃新闻记者从中国科学院获悉,当天,随舱下行的时隔6年东宝灰姑娘选美冠军再次诞生盘点历届冠军谁成为真公主?小编最近无意间刷到了六年一举办的东宝灰姑娘选美大赛。怎么说呢,这次选出来的冠军看起来也太幼了吧!可能有的宝子还不知道东宝的选美,是东宝株式会社举办的从普通人群中寻找灰姑娘的大赛东宝盘点2023玩家期待新作塞尔达王国之泪网龙魔域手游2阿凡达临近年底,距离很多游戏新作的上线又进了一步。众所周知,由于各种原因原先很多作品本来在今年上线但又不得不推迟到2023年,因而2023年又成为了很多游戏玩家期待的一年。这次小编就整理三亚民宿预订量增长近三成,民宿老板期待很久了,我们已经做好准备12月5日,海南省海口三亚儋州澄迈东方等多个市县发布关于调整省外来(返)人员疫情防控管理措施的通告,宣布自即日起,海南上述市县对省外来(返)人员不再实施分类管理。12月5日深夜,关