我学会了,备忘录模式

简介: 备忘录模式属于行为型模式,这个类型的设计模式总结出了 类、对象之间的经典交互方式,将类、对象的行为和使用解耦了,花式的去使用对象的行为来完成特定场景下的功能。

前言

备忘录模式属于行为型模式,这个类型的设计模式总结出了 类、对象之间的经典交互方式,将类、对象的行为和使用解耦了,花式的去使用对象的行为来完成特定场景下的功能。

备忘录模式

使用场景:当你要对某一个对象的数据进行备份和回滚时,你可以使用备忘录模式。备忘录模式和原型模式有异曲同工之妙,从语义上讲,原型模式是创建型模式用于创建对象,而备忘录模式用于恢复数据某一刻状态、回滚数据某一刻的状态,是一种行为。

理解:这是一种类、对象之间的经典交互方式,将类、对象的行为和使用解耦了。备忘录,顾名思义,备忘录模式用于备份数据在某一个时间内的状态,类似于游戏存档,能存档自然能够读档。

namespace action_mode_08 {

    interface IMemento {
        store(key: string, game: Game): string
        restore(key: string):  Game | undefined 
    }

    class GameStorage implements IMemento {

        file: Map<string, Game> = new Map()

        store(key: string, game: Game): string {
            if (this.file.has(key)) {
                console.log('已存在该记录,覆盖式存档')
            }

            const newGame = new Game(game.name)
            newGame.hp = game.hp
            newGame.mp = game.mp
            newGame.level = game.level
            newGame.killBoos = game.killBoos
            newGame.grade = game.grade

            this.file.set(key, newGame)
            return key
        }

        restore(key: string): Game | undefined {
            if (!this.file.has(key)) {
                console.log('查无此存档')
            }

            return this.file.get(key)
        }
    }

    class Game{

        name: string
        hp: number
        mp: number
        level: number
        killBoos: number
        grade: number

        gameStorage: GameStorage

        constructor(name: string) {
            this.name = name
            this.hp = 100
            this.mp = 100
            this.level = 1
            this.killBoos = 0
            this.grade = 1
            this.gameStorage = new GameStorage()
        }

        praintInfo () {

            console.log('===========游戏数据 展示开始 ==========')

            console.log(`用户名:${this.name}`)
            console.log(`所在关卡:${this.grade}`)
            console.log(`等级:${this.level}`)
            console.log(`血量:${this.hp}`)
            console.log(`魔法:${this.mp}`)
            console.log(`杀boos数:${this.killBoos}`)

            console.log('===========游戏数据 展示结束 ==========')

        }

        play() {

            console.log('-----------------打游戏----------------')
            console.log(`用户名:${this.name}`)
            console.log(`所在关卡:${this.grade}`)
            console.log(`等级:${this.level}`)
            console.log(`血量:${this.hp}`)
            console.log(`魔法:${this.mp}`)
            console.log(`杀boos数:${this.killBoos}`)

            this.hp -= ~~(Math.random() * 10)
            this.mp -= ~~(Math.random() * 10)
            this.level ++
            this.killBoos ++
            this.grade ++

            if (this.hp < 1) {
                
                this.praintInfo()
                console.log('血量低于 0,结束游戏。')
                return false
            }
            return true
        }

        store(): string {
            console.log('存档中')
            return this.gameStorage.store(Date.now().toString(), this)
        }

        restore(key: string): Game | undefined {
            console.log('存档回滚')
            return this.gameStorage.restore(key)
        }
    }

    let game = new Game('江湖百晓生')
    game.praintInfo()

    const flag = game.store()

    game.play()
    game.play()
    game.play()
    game.play()
    game.play()
    game.play()

    game = game.restore(flag) as Game
    game.praintInfo()

}
目录
相关文章
|
存储 缓存 NoSQL
聊聊 Redis 的高级特性之一: 发布订阅
Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。 图中,消费者1和消费者2 订阅了 Redis 服务的频道 channel ,当生产者通过 PUBLISH 命令发送给频道 channel 时, 这个消息就会被发送给订阅它的两个客户端。
1087 0
聊聊 Redis 的高级特性之一: 发布订阅
|
弹性计算
2023年阿里云服务器多少钱1年?免费试用版不要钱,收费版108元1年起
2023年购买阿里云服务器多少钱1年?如果是申请试用版云服务器就不需要钱,现在轻量应用服务器最低108元1年,通用型u1云服务器最低1532.04元1年,计算型c7云服务器最低2129.41元1年,通用型g7云服务器最低2608.62元1年,内存型r7云服务器最低3325.97元1年,不过阿里云增加了不少免费试用版云服务器,现在最高可以申请到4核16G配置的云服务器免费试用1个月,最长可以申请2核4G配置的云服务器免费试用3个月。
2023年阿里云服务器多少钱1年?免费试用版不要钱,收费版108元1年起
|
6月前
|
人工智能 数据可视化 安全
2025年销售自动化工具选型指南
本文探讨了企业在数字经济时代选择合适CRM系统的重要性,分析了选型的5大核心维度:AI能力、全流程闭环管理、生态集成能力、数据安全合规及供应商综合实力。同时对比了5家国内外CRM厂商,如Salesforce、纷享销客、Hubspot等,并指出企业常遇的3大选型误区,包括功能冗余、忽视数据迁移成本和迷信行业模板。文章强调,适合企业的CRM需与战略、管理和业务流程深度适配,而非单纯追求技术堆砌。最终提醒管理者,选择CRM时应以实际需求为导向,而非盲目迷信国际品牌。
|
Rust 安全 JavaScript
探索Rust在系统编程领域的前景:虚拟机和编译器开发的新篇章
【8月更文挑战第31天】在系统编程领域,性能与安全性至关重要。Rust作为一种新兴语言,凭借其独特的内存安全和并发特性,正逐渐成为虚拟机和编译器开发的首选。本文通过案例分析,探讨Rust在这些领域的应用,例如Facebook的Compiler VM (CVM)项目和实验性的JavaScript JIT编译器Mithril。Rust的静态类型系统和所有权模型确保了高性能和安全性,而其强大的包管理和库生态则简化了虚拟机的开发。随着Rust社区的不断成熟,预计未来将有更多基于Rust的创新项目涌现,推动系统编程的发展。对于追求高性能和安全性的开发者而言,掌握Rust将成为一个重要战略方向。
272 1
|
11月前
|
机器学习/深度学习 数据采集 分布式计算
【Python篇】深入机器学习核心:XGBoost 从入门到实战
【Python篇】深入机器学习核心:XGBoost 从入门到实战
1030 3
|
编译器 API
Compose:长期副作用 + 智能重组 = 若智?(一)
Compose:长期副作用 + 智能重组 = 若智?
228 0
|
SQL 分布式计算 DataWorks
DataWorks产品使用合集之如何将STRING类型转换为DATETIME类型
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
237 1
|
12月前
|
大数据
用wordcloud搞词云,大数据词云,自定义图像
用wordcloud搞词云,大数据词云,自定义图像
|
存储 算法 调度
基于和声搜索算法(Harmony Search,HS)的机器设备工作最优调度方案求解matlab仿真
通过和声搜索算法(HS)实现多机器并行工作调度,以最小化任务完成时间。在MATLAB2022a环境下,不仅输出了工作调度甘特图,还展示了算法适应度值的收敛曲线。HS算法模拟音乐家即兴创作过程,随机生成初始解(和声库),并通过选择、微调生成新解,不断迭代直至获得最优调度方案。参数包括和声库大小、记忆考虑率、音调微调率及带宽。编码策略将任务与设备分配映射为和声,目标是最小化完成时间,同时确保满足各种约束条件。
【高阶数据结构】图 -- 详解(上)
【高阶数据结构】图 -- 详解(上)