当前位置: 首页 > wzjs >正文

网页的创新型网站策划网站模板怎么套用

网页的创新型网站策划,网站模板怎么套用,qq怎么做放资源的网站,seo搜索引擎优化5备忘录模式(Memento Pattern)详解一、备忘录模式简介 备忘录模式(Memento Pattern) 是一种 行为型设计模式(对象行为型模式),它允许在不暴露对象内部结构的情况下保存和恢复对象的状态。换句话说…

备忘录模式(Memento Pattern)详解


一、备忘录模式简介

备忘录模式(Memento Pattern) 是一种 行为型设计模式(对象行为型模式),它允许在不暴露对象内部结构的情况下保存和恢复对象的状态。换句话说,备忘录模式提供了一种状态恢复机制,使得你可以在需要的时候将对象的状态保存下来,并且能够在未来的某个时刻恢复到之前保存的状态。

别名为标记(Token)模式
提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤。
当前在很多软件所提供的撤销(Undo)操作中就使用了备忘录模式。

你可以把它想象成“存档”功能:在游戏中,玩家可以随时保存游戏进度并在必要时加载这个进度继续游戏。

备忘录模式——软件中的“后悔药”——撤销(Undo)

在这里插入图片描述
通过使用备忘录模式可以让系统恢复到某一特定的历史状态。

首先保存软件系统的历史状态,当用户需要取消错误操作并且返回到某个历史状态时,可以取出事先保存的历史状态来覆盖当前状态。

备忘录模式包含以下3个角色
Originator(原发器)
Memento(备忘录)
Caretaker(负责人)

在这里插入图片描述


二、解决的问题类型

备忘录模式主要用于解决以下问题:

  • 需要记录对象的历史状态以便于回滚操作:例如撤销/重做功能。
  • 避免直接暴露对象内部状态:保护数据隐私的同时允许外部存储这些状态。
  • 管理复杂对象的状态变化:如编辑器中的文档编辑历史记录。

三、使用场景

场景示例
撤销/重做功能文本编辑器、绘图软件等
游戏存档角色扮演游戏中的存档点
历史版本控制软件开发中的代码版本控制系统

四、核心概念

  1. Originator(发起人):负责创建一个备忘录对象来保存其内部状态,并可以从备忘录中恢复其内部状态。
  2. Memento(备忘录):用于存储 Originator 的内部状态。该类仅对 Originator 可见,防止其他对象访问或修改备忘录的内容。
  3. Caretaker(管理者):负责保存备忘录对象,但不直接操作备忘录内容。

五、实际代码案例(Java)

1. 定义 Memento 类

// 备忘录类,用于保存发起人的状态
class EditorMemento {private String content;public EditorMemento(String content) {this.content = content;}public String getContent() {return content;}
}

2. 定义 Originator 类

// 发起人类,拥有创建和应用备忘录的能力
class TextEditor {private String content;public void setContent(String content) {System.out.println("Setting content: " + content);this.content = content;}public String getContent() {return content;}// 创建备忘录public EditorMemento createMemento() {System.out.println("Saving state...");return new EditorMemento(content);}// 应用备忘录public void restoreFromMemento(EditorMemento memento) {this.content = memento.getContent();System.out.println("Restored to: " + this.content);}
}

3. 定义 Caretaker 类

// 管理者类,持有备忘录对象
class HistoryManager {private Stack<EditorMemento> history = new Stack<>();public void saveState(EditorMemento memento) {history.push(memento);}public EditorMemento undo() {if (!history.isEmpty()) {return history.pop();} else {System.out.println("No more states to undo.");return null;}}
}

4. 客户端测试类

public class Client {public static void main(String[] args) {TextEditor editor = new TextEditor();HistoryManager history = new HistoryManager();editor.setContent("First draft");history.saveState(editor.createMemento());editor.setContent("Second draft");history.saveState(editor.createMemento());editor.setContent("Final draft");System.out.println("Current Content: " + editor.getContent());System.out.println("Undoing last change...");EditorMemento previousState = history.undo();if (previousState != null) {editor.restoreFromMemento(previousState);}System.out.println("Current Content after undo: " + editor.getContent());}
}

输出结果:

Setting content: First draft
Saving state...
Setting content: Second draft
Saving state...
Setting content: Final draft
Current Content: Final draft
Undoing last change...
Restored to: Second draft
Current Content after undo: Second draft
典型代码(C#)

典型的原发器类代码

namespace MementoSample
{public class Originator{private string state;public Originator(string state){this.state = state;}// 创建一个备忘录对象internal Memento CreateMemento() {return new Memento(this);}// 根据备忘录对象恢复原发器状态internal void RestoreMemento(Memento m) {state = m.GetState();}public void SetState(string state) {this.state=state;}public string GetState() {return this.state;}
}
}

典型的备忘录类代码

namespace MementoSample
{//备忘录类,默认可见性,在程序集内可见internal class Memento{private string state;internal Memento(Originator o){state = o.GetState();}internal void SetState(string state){this.state = state;}internal string GetState(){return this.state;}}
}

备忘录模式的实现
除了Originator类,不允许其他类来调用备忘录类Memento的构造函数与相关方法。
如果允许其他类调用SetState()等方法,将导致在备忘录中保存的历史状态发生改变,通过撤销操作所恢复的状态就不再是真实的历史状态,备忘录模式也就失去了本身的意义 。
理想的情况是只允许生成该备忘录的原发器访问备忘录的内部状态。

C#语言实现:
将Memento类与Originator类定义在同一个程序集(Assembly)中来实现封装,使用访问标识符internal来定义Memento类,即保证其在程序集内可见。
将备忘录类作为原发器类的内部类,使得只有原发器才可以访问备忘录中的数据,其他对象都无法使用备忘录中的数据。

典型的负责人类代码

namespace MementoSample
{public class Caretaker{private Memento memento;internal Memento GetMemento(){return memento;}internal void SetMemento(Memento memento){this.memento = memento;}}
}

客户端演示代码

using System;
namespace MementoSample
{class Program{static void Main(string[] args){//创建原发器对象Originator ori = new Originator("状态(1)");Console.WriteLine(ori.GetState());//创建负责人对象,保存创建的备忘录对象Caretaker ct = new Caretaker();ct.SetMemento(ori.CreateMemento());ori.SetState("状态(2)");Console.WriteLine(ori.GetState());//从负责人对象中取出备忘录对象,实现撤销ori.RestoreMemento(ct.GetMemento());Console.WriteLine(ori.GetState());Console.Read();}}
}
其他案例
  1. 某软件公司要使用C#语言开发一款可以运行在Windows Phone移动平台的触摸式中国象棋软件,由于考虑到有些用户是“菜鸟”,经常不小心走错棋;还有些用户因为不习惯使用手指在手机屏幕上拖动棋子,常常出现操作失误,因此该中国象棋软件要提供“悔棋”功能,在用户走错棋或操作失误后可恢复到前一个步骤。如下图所示
    在这里插入图片描述
    为了实现“悔棋”功能,现使用备忘录模式来设计该中国象棋软件

在这里插入图片描述

六、优缺点分析

优点描述
保护对象的封装性不破坏对象内部结构即可备份和恢复状态
简化状态管理逻辑将状态管理职责分离给专门的角色处理
支持撤销功能提供了良好的撤销/重做机制。提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤。
缺点描述
资源消耗大如果频繁保存大量状态信息,可能会占用较多内存
实现复杂度增加需要额外维护备忘录对象及相应的管理逻辑

七、与其他模式对比(补充)

模式名称目标
命令模式封装请求作为对象,使不同的请求参数化
状态模式根据内部状态改变对象的行为
备忘录模式在不影响对象的前提下保存和恢复对象的状态

八、最终小结

备忘录模式是一种非常有用的设计模式,特别适用于那些需要记录和恢复对象状态的应用场景。通过合理地运用备忘录模式,我们可以在保持对象封装性的前提下,有效地实现撤销/重做等功能,提升用户体验。

在开发文本编辑器、图形界面应用程序、游戏等项目时,备忘录模式能够帮助你更好地管理和控制对象的状态变化。


📌 一句话总结:

备忘录模式就像给对象拍快照,让你能在任何时候回顾并恢复到以前的状态。


推荐使用方式:

  • 当你需要为用户提供撤销功能时;
  • 对象的状态较为复杂,且需要定期保存时;
  • 要求系统具有高可扩展性和灵活性时。

九、扩展

实现多次撤销

动机

  1. 有时候用户需要撤销多步操作。
  2. 实现方案:在负责人类中定义一个集合来存储多个备忘录,每个备忘录负责保存一个历史状态,在撤销时可以对备忘录集合进行逆向遍历,回到一个指定的历史状态,还可以对备忘录集合进行正向遍历,实现重做(Redo)或恢复操作,即取消撤销,让对象状态得到恢复。

在这里插入图片描述

ce MementoSample
{public class MementoCaretaker{//定义一个集合来存储多个备忘录private ArrayList mementolist = new ArrayList();internal ChessmanMemento GetMemento(int i){return (ChessmanMemento)mementolist[i];}internal void SetMemento(ChessmanMemento memento){mementolist.Add(memento);}}
}
  1. 用户信息操作撤销
    某系统提供了用户信息操作模块,用户可以修改自己的各项信息。为了使操作过程更加人性化,现使用备忘录模式对系统进行改进,使得用户在进行了错误操作之后可以恢复到操作之前的状态。

在这里插入图片描述

部分内容有AI生成,请注意识别!


文章转载自:

http://FAgZMZZ2.drjLL.cn
http://4Ebb0hO1.drjLL.cn
http://NKrb6sUd.drjLL.cn
http://ckxfS5lh.drjLL.cn
http://3b5kRxuL.drjLL.cn
http://4ybO3ntS.drjLL.cn
http://ejlTLBRo.drjLL.cn
http://hjuNEzPQ.drjLL.cn
http://fJyQHxp2.drjLL.cn
http://bnus4Ozp.drjLL.cn
http://rrzufc5t.drjLL.cn
http://NwqdsLKQ.drjLL.cn
http://OCkJiot9.drjLL.cn
http://5PUMdDog.drjLL.cn
http://8TCXXQwj.drjLL.cn
http://3l07vp2L.drjLL.cn
http://eCDOf18p.drjLL.cn
http://0oc3TiBS.drjLL.cn
http://MNNUEdQC.drjLL.cn
http://3NJj4kO5.drjLL.cn
http://bekEt0TW.drjLL.cn
http://8haanuvm.drjLL.cn
http://JyiBfzsC.drjLL.cn
http://7cpUOlDq.drjLL.cn
http://QS8PcuzJ.drjLL.cn
http://ZTWO7zti.drjLL.cn
http://HbNAImgM.drjLL.cn
http://nNCNmbwb.drjLL.cn
http://1lsGDStw.drjLL.cn
http://t04fNRRp.drjLL.cn
http://www.dtcms.com/wzjs/686438.html

相关文章:

  • 某网站seo诊断分析和优化方案义乌网站建设优化排名
  • 手机app网站规划网站总结
  • 佛山网站建设优化百度如何收录网站
  • 企业网站产品内页优化公司网络营销方案思路
  • 安全的集团网站建设金融投资公司网站模板
  • 相关网站查询seo顾问招聘
  • 网站开发工程师工作描述wordpress如何设置用户浏览权限
  • 免费公司网页制作wordpress必备优化插件
  • 专做写字楼出租的网站911制品厂麻花
  • 私募股权基金网站建设wordpress增加动效
  • 留言网站模板给企业做网站
  • 聊城做网站多少钱wordpress module破解
  • 厦门网站建设建设公司建设响应式网站有哪些好处
  • 公司网站建设制作wordpress 严重 漏洞
  • 免费学设计的网站网站程序更换
  • 建设公司网站需要注意什么汽车logo设计图片创意
  • 网站图片上传却不显示不出来有什么网站做生鲜配送的
  • dnf可以去哪个网站做代练淮北论坛房产
  • 怎么给企业制作网站内网网站建设汇报
  • 网站开发一个模板费用重庆速代网络科技
  • 湛江网站建设方案维护网站建设子目录
  • 室内设计网站模板深圳做网站排名价格
  • 做app还是网站深圳网络有限公司有哪些
  • 四川省中国建设银行招聘信息网站wordpress导入大于2m
  • 网站建设夜猫孝感个人网站建设
  • 网站开发商标属于哪一类wordpress分销商城
  • 公司网站内容相近wordpress根据用户名生成头像
  • 东莞做微网站建设价格wordpress里的关键词在哪设置
  • 网站后台登陆密码wordpress好看的背景图片
  • 学生成绩管理系统网站建设深圳3区最新通告