当前位置: 代码迷 >> 综合 >> 备忘录设计模式笔记
  详细解决方案

备忘录设计模式笔记

热度:35   发布时间:2024-02-27 02:36:20.0

1. 备忘录角色(Memoto)

/*** 备忘录类*/
class Memoto {var checkPoint = 0var lifeValue = 0var weapon = ""override fun toString(): String {return "Memoto [checkPoint=$checkPoint, lifeValue=$lifeValue, weapon=$weapon]"}
}

2. 管理备忘录角色(Caretaker)

/*** 负责管理备忘录Memoto*/
class Caretaker {private lateinit var memoto: Memoto/*** 存档*/fun archive(memoto: Memoto) {this.memoto = memoto}/*** 获取存档*/fun getMemoto(): Memoto {return memoto}
}

3. Originator(需要保存状态的角色)

import android.util.Log/*** 使命召唤游戏 (模拟)*/
class CallOfDuty {var checkPoint = 1var lifeValue = 100var weapon = "沙漠之鹰"fun play() {Log.d("CallOfDuty",  "玩游戏 : 第${checkPoint}关 奋战杀敌中")lifeValue -= 10Log.d("CallOfDuty",  "进度升级啦")checkPoint++Log.d("CallOfDuty",  "到达 ${checkPoint}关")}fun quit() {Log.d("CallOfDuty",  "--------------------")Log.d("CallOfDuty", "退出前的游戏属性$this")Log.d("CallOfDuty",  "退出游戏")Log.d("CallOfDuty",  "--------------------")}fun createMemoto() : Memoto {var memoto = Memoto()memoto.checkPoint = checkPointmemoto.lifeValue = lifeValuememoto.weapon = weaponreturn memoto}fun restoreMemoto(memoto: Memoto){this.checkPoint = memoto.checkPointthis.lifeValue = memoto.lifeValuethis.weapon = memoto.weaponLog.d("CallOfDuty", "恢复后的游戏属性$this")}override fun toString(): String {return "CallOfDuty [checkPoint=$checkPoint, lifeValue=$lifeValue, weapon=$weapon]"}
}

可以看到,Originator的内部状态,通过Memoto备忘录保存起来,并可以通过一个Memoto 对象恢复。

而这个Memoto由Caretaker负责管理 (Caretaker 持有一个Memoto对象,用于保存状态信息)

4. 测试代码

    @Testfun testMemoto(){Log.d(TAG, "====================testMemoto====================")//游戏var game = CallOfDuty()//备忘录管理者var caretaker = Caretaker()//1.打游戏game.play()//2.存档 (每次都根据当前状态创建一个新的备忘录)caretaker.archive(game.createMemoto())//3.退出游戏game.quit()//4.恢复游戏(创建一个新的游戏对象), 状态从caretaker 对象中获取var newGame = CallOfDuty()newGame.restoreMemoto(caretaker.getMemoto())}

5. 测试结果

10-10 15:59:17.125  3703  3728 D DesignPattern: ====================testMemoto====================
10-10 15:59:17.126  3703  3728 D CallOfDuty: 玩游戏 : 第1关 奋战杀敌中
10-10 15:59:17.126  3703  3728 D CallOfDuty: 进度升级啦
10-10 15:59:17.126  3703  3728 D CallOfDuty: 到达 2关
10-10 15:59:17.126  3703  3728 D CallOfDuty: --------------------
10-10 15:59:17.127  3703  3728 D CallOfDuty: 退出前的游戏属性CallOfDuty [checkPoint=2, lifeValue=90, weapon=沙漠之鹰]
10-10 15:59:17.127  3703  3728 D CallOfDuty: 退出游戏
10-10 15:59:17.127  3703  3728 D CallOfDuty: --------------------
10-10 15:59:17.127  3703  3728 D CallOfDuty: 恢复后的游戏属性CallOfDuty [checkPoint=2, lifeValue=90, weapon=沙漠之鹰]

 

  相关解决方案