Android设计模式详解之备忘录模式

前言

备忘录模式是一种行为模式,该模式用于保存对象当前状态,并且在之后可以再次恢复到此状态;

定义:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样,以后就可以将该对象恢复到原先保存的状态;

使用场景:

  • 需要保存一个对象在某一个时刻的状态或部分状态;
  • 如果用一个接口来让其他对象得到这些状态,将会暴露对象的实现细节并破坏对象的封装性,一个对象不希望外界直接访问其内部状态,通过中间对象可以间接访问其内部状态;

UML类图:
备忘录模式UML

  • Memo:备忘录角色,用于存储Originator内部状态,并且可以防止Originator以外的对象访问Memo
  • Originator:负责创建一个备忘录,可以记录、恢复自身的内部状态,同时Originator还可以根据需要决定Memo存储自身的哪些内部状态;
  • Caretaker:负责存储备忘录,不能对备忘录的内容进行操作和访问,只能够将备忘录传递给其他对象;

实现示例

这里以玩游戏打怪闯关为例,等级level关卡customPass为内部状态,玩游戏时升级闯关改变状态,退出游戏时进行存档,再次进入游戏时读取备忘录数据恢复数据;

  • 定义备忘录角色,Memo
/**
 * 游戏,备忘录角色,状态记录
 * @param level 等级
 * @param customPass 关卡
 */
data class Memo(val level: Int = 0, val customPass: Int = 0)
  • 定义创建一个备忘录角色,拥有等级level关卡customPass属性,Originator
/**
 * 创建一个备忘录,可以记录、恢复自身状态
 */
class Originator {
    /**
     * 当前等级
     */
    private var level: Int = 0

    /**
     * 当前关卡
     */
    private var customPass: Int = 0

    /**
     * 玩游戏升级闯关
     */
    fun playGame() {
        println("当前第${customPass}关卡,当前${level}级!")
        println("-------------------------")
        level += 2
        println("经验满了,升级了!")
        customPass++
        println("又打过一关!")
        println("-------------------------")
    }

    /**
     * 退出游戏
     */
    fun quitGame() {
        println("退出游戏,当前第${customPass}关卡,当前${level}级!")
        println("-------------------------")
    }

    /**
     * 恢复游戏进度
     */
    fun restoreGame(memo: Memo) {
        level = memo.level
        customPass = memo.customPass
        println("重新进入游戏,当前第${customPass}关卡,当前${level}级!")

    }

    /**
     * 创建备忘录
     */
    fun createMemo(): Memo {
        return Memo(level, customPass)
    }


}
  • 定义存储备忘录角色,Caretaker
/**
 *
 * 存储备忘录,不能操作和访问
 */
class Caretaker {
    private var memo = Memo()

    /**
     * 存储
     */
    fun saveMemo(memo: Memo) {
        this.memo = memo
    }

    /**
     * 获取
     */
    fun getMemo(): Memo {
        return memo
    }
}
  • 编写测试类,验证功能
object Test {

    @JvmStatic
    fun main(args: Array<String>) {
        val originator = Originator()
        //升级闯关
        originator.playGame()
        originator.playGame()

        //进行游戏存档
        val caretaker = Caretaker()
        caretaker.saveMemo(originator.createMemo())
        //退出游戏
        originator.quitGame()
        //重新进入游戏
        val newOriginator = Originator()
        newOriginator.restoreGame(caretaker.getMemo())
    }
}

结果输出如下:

当前第0关卡,当前0!
-------------------------
经验满了,升级了!
又打过一关!
-------------------------
当前第1关卡,当前2!
-------------------------
经验满了,升级了!
又打过一关!
-------------------------
退出游戏,当前第2关卡,当前4!
-------------------------
重新进入游戏,当前第2关卡,当前4!

Android源码中的备忘录模式

  • Activity中的onSaveInstanceState(outState: Bundle) onRestoreInstanceState(savedInstanceState: Bundle)方法
  1. 这里Activity扮演了Caretaker的角色,负责存储、恢复UI的状态信息;
  2. 界面中的View、ViewGroup等扮演了Originator的角色,代表需要存储状态的对象;
  3. 数据存储角色Memo则由Bundle扮演;

总结

优点:

  • 给用户提供了一种可以恢复状态的机制,可以使用户方便地回到某个历史状态;
  • 实现了信息的封装,使得用户不需要关心状态的保存细节;

缺点:

  • 消耗资源,如果类的成员变量过多,会占用较大的资源,每一次保存也会占用一定的内存;

结语

如果以上文章对您有一点点帮助,希望您不要吝啬的点个赞加个关注,您每一次小小的举动都是我坚持写作的不懈动力!ღ( ´・ᴗ・` )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值