「备忘录(Memento)」设计模式 Swift实现

news/2024/7/20 22:07:47 标签: swift, 设计模式, 开发语言, 备忘录模式, ios

文章目录

设计模式介绍

备忘录设计模式(Memento Pattern)是一种行为型设计模式,它可以在不破坏封装性的情况下,捕获并保存一个对象的内部状态,并在需要时恢复该对象的状态。

在这种模式中,备忘录对象用于存储一个对象的状态,而负责人对象(Caretaker)用于管理备忘录对象,负责维护版本历史记录,并提供恢复对象状态的功能。

下面我们用一个简单的 Swift 代码例子来阐述备忘录设计模式的应用。

具体业务场景举例

假设我们有一个文本编辑器,其中可以进行文本编辑,并支持撤销操作。我们可以使用备忘录模式来实现

首先,我们定义一个 Memento 对象,用于存储文本编辑器的状态

swift">class Memento {
    var text: String
    init(text: String) {
        self.text = text
    }
}

然后,我们定义一个 Editor 对象,负责产生文本的状态,并将其保存在 Memento 对象中:

swift">class Editor {
    var text: String
    var history: [Memento] = []
    
    init(text: String) {
        self.text = text
        save()
    }
    
    func save() {
        let memento = Memento(text: self.text)
        history.append(memento)
    }
    
    func restore(memento: Memento) {
        self.text = memento.text
    }
    
    func undo() {
        guard history.count >= 2 else {
            return
        }
        history.removeLast()
        restore(memento: history.last!)
    }
}

在 Editor 中,我们维护了一个历史记录数组 history,用于存储所有文本状态的 Memento 对象。save() 方法会创建一个新的 Memento 对象,并将其添加到历史记录数组中。restore() 方法则会将指定的 Memento 对象中存储的文本状态恢复到当前对象中。最后,undo() 方法会删除最后一个历史记录,并将当前对象的状态恢复为上一个历史记录中保存的状态。

最后,我们可以在客户端代码中实例化 Editor 对象,并对其进行编辑和撤销:

swift">let editor = Editor(text: "Hello World")

editor.text = "Hello Swift"
editor.save()

editor.text = "Hello iOS"
editor.save()

editor.text = "Hello SwiftUI"
editor.undo()

print(editor.text) // 输出结果:Hello iOS

在这个代码示例中,我们使用备忘录模式实现了文本编辑器的撤销功能,使得文本状态可以保存和恢复,从而使得用户可以对编辑历史进行撤销操作。


http://www.niftyadmin.cn/n/480126.html

相关文章

邀请功能的实现分析

邀请功能 功能分析 场景:项目中出现用户邀请其他用户加入群组的功能 需求:用户点击生成邀请链接可以生成一个url,将这个url分享给其他用户,其他用户点击后对用户登录状态进行校验,校验通过即可加入群组,…

Linux在线升级JDK版本(不用去官网下载安装包)

Linux在线升级JDK版本 ​ 只要3个命令 确保系统已连接到互联网:确保你的 Linux 系统已连接到互联网,以便下载和安装新的 JDK 版本。 更新软件包管理器:运行以下命令来更新系统的软件包管理器(在不同的 Linux 发行版中&#xff0…

Django+celery开启时报错

django.db.utils.DatabaseError: DatabaseWrapper objects created in a thread can only be used in that same thread. The object with alias default was created in thread id 19767205568 00 and this is thread id 1976775359680. 问题: 执行celery worker …

leecode-下一排列

题目 题目 分析 妈呀,其实我直接调用函数,一行代码就通过了hhh,不过这种取巧的方式不可取,还是得老老实实的写。 首先需要明白什么叫下一排列? 比如输入: 1 5 8 4 7 6 5 3 1 答案就是: 1 5 …

一步一步学OAK之四:实现如何在低延迟下使用高分辨率视频

目录 Setup 1: 创建文件Setup 2: 安装依赖Setup 3: 导入需要的包Setup 4: 创建pipelineSetup 5: 创建节点Setup 6: 设置节点的属性和参数。Setup 7: 建立链接关系Setup 8: 连接设备并启动管道Setup 9: 创建与DepthAI设备通信的输入队列和输出队列Setup 10: 主循环获取视频帧显示…

Android10.0 iptables用IOemNetd实现app某个时间段禁止上网的功能实现

1.前言 在10.0的系统rom定制化开发中,在system中netd网络这块的产品需要中,会要求设置app某个时间段禁止上网的功能, liunx中iptables命令也是比较重要的,接下来就来在IOemNetd这块实现app某个时间段禁止上网的的相关功能,就是在 系统中只能允许某个app某个时间段禁止上网…

Redis的数据复制到另一台Redis

Redis的数据复制到另一台Redis 最近用到一个问题,需要把Redis的数据复制到另一台Redis,现在总结下解决问题的方法 解决方法一: redis-dump导出 [root ~]# redis-dump -u :password172.20.0.1:6379 > 172.20.0.1.jsonredis-load导入 [ro…

ChatGPT是否能够模拟人类的情感和语气?

ChatGPT作为一个基于GPT-3.5架构的语言模型,可以在一定程度上模拟人类的情感和语气。尽管模型没有真实的情感体验,也没有意识或情感感知能力,但它通过学习大量的文本数据,可以产生看似具有情感和语气的回答。 在训练过程中&#…