行为型模式 - 备忘录模式

系列文章目录

设计模式 - 设计原则

创建型模式 - 单例模式(一)
创建型模式 - 工厂模式(二)
创建型模式 - 原型模式(三)
创建型模式 - 建造者模式(四)

结构型模式 - 适配器模式(一)
结构型模式 - 桥接模式(二)
结构型模式 - 装饰器模式(三)
结构型模式 - 组合模式(四)
结构型模式 - 外观模式(五)
结构型模式 - 享元模式(六)
结构型模式 - 代理模式(七)

行为型模式 - 模板方法模式(一)
行为型模式 - 命令模式(二)
行为型模式 - 访问者模式(三)
行为型模式 - 迭代器模式(四)
行为型模式 - 观察者模式(五)
行为型模式 - 中介者模式(六)
行为型模式 - 备忘录模式(七)
行为型模式 - 解释器模式(八)
行为型模式 - 状态模式(九)
行为型模式 - 策略模式(十)
行为型模式 - 责任链模式(十一)


文章目录

  • 系列文章目录
  • 前言
  • 一、备忘录模式
    • 1.1 备忘录模式介绍
    • 1.2 备忘录模式结构
  • 二、实现
    • 2.1 备忘录实现
  • 三、备忘录模式总结
    • 3.1 备忘录的应用场景
    • 3.2 备忘录模式、命令模式区别
    • 3.3 备忘录模式优缺点
  • 四、参考文献


前言

代码地址


一、备忘录模式

1.1 备忘录模式介绍

  • 备忘录(Memento)模式:

    又称快照模式,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态;

1.2 备忘录模式结构

行为型模式 - 备忘录模式_第1张图片

  • 源发器(Originator)角色:
    • 也叫发起人角色,记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里面的所有信息;
  • 备忘录(Memento)角色:
    • 复杂存储发起人的内部状态,在需要的时候提供这些诶补状态给发起人;
  • 管理员(Caretaker)角色:
    • 对备忘录进行管理,提供保存与湖区备忘录的功能,但其不能对被忘了的内容进行访问与修改;

二、实现

例子:

  • 张三在玩游戏玩的正嗨,突然孩子哭了,要吃奶,你保存了游戏,给孩子冲奶。。。

2.1 备忘录实现

行为型模式 - 备忘录模式_第2张图片

package com.dozezz.designpattern.memento;

import java.util.Random;

/**
 * 发起人
 */
public class Originator {
    /**
     * 剩余金币
     */
    private Integer coin;
    /**
     * 血量
     */
    private Integer hp;
    /**
     * 蓝量
     */
    private Integer mp;

    /**
     * 等级
     */
    private Integer level;

    public Memento createMemento(){
        return new Memento(this.coin,this.hp,this.mp,this.level);
    }


    public void recovery(Memento memento){
        this.setCoin( memento.getCoin());
        this.setHp(memento.getHp());
        this.setMp(memento.getMp());
        this.setLevel(memento.getLevel());
    }

    public void playGame(){
        System.out.println("开始玩游戏 。。");
        int i = new Random().nextInt(100);
        this.coin = i ;
        this.hp = i ;
        this.mp = i ;
        this.level = i ;
    }


    public void display(){
        System.out.println(String.format("当前角色:金币 : %d 血量:%d 蓝量:%d 等级:%d", this.coin,this.hp,this.mp,this.level));
    }

    public Integer getCoin() {
        return coin;
    }

    public void setCoin(Integer coin) {
        this.coin = coin;
    }

    public Integer getHp() {
        return hp;
    }

    public void setHp(Integer hp) {
        this.hp = hp;
    }

    public Integer getMp() {
        return mp;
    }

    public void setMp(Integer mp) {
        this.mp = mp;
    }

    public Integer getLevel() {
        return level;
    }

    public void setLevel(Integer level) {
        this.level = level;
    }
}
package com.dozezz.designpattern.memento;

/**
 * 备忘录
 */
public class Memento {
    /**
     * 剩余金币
     */
    private Integer coin;
    /**
     * 血量
     */
    private Integer hp;
    /**
     * 蓝量
     */
    private Integer mp;

    /**
     * 等级
     */
    private Integer level;

    public Memento(Integer coin, Integer hp, Integer mp, Integer level) {
        this.coin = coin;
        this.hp = hp;
        this.mp = mp;
        this.level = level;
    }

    public Integer getCoin() {
        return coin;
    }

    public void setCoin(Integer coin) {
        this.coin = coin;
    }

    public Integer getHp() {
        return hp;
    }

    public void setHp(Integer hp) {
        this.hp = hp;
    }

    public Integer getMp() {
        return mp;
    }

    public void setMp(Integer mp) {
        this.mp = mp;
    }

    public Integer getLevel() {
        return level;
    }

    public void setLevel(Integer level) {
        this.level = level;
    }
}
package com.dozezz.designpattern.memento;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * 管理者
 */
public class CareTaker {
    /**
     * 只保存一次备忘录对象
     */
//    private Memento memento;

    /**
     * 保存许多备忘录对象
     */
    private  List<Memento> mementoList = new ArrayList<>();

    /**
     * 对多个角色保存多个备忘录对象
     */
//    private HashMap> listHashMap = new HashMap<>();

    public void addMemento(Memento memento) {
        if (!mementoList.contains(memento)) {
            mementoList.add(memento);
        }
    }

    /**
     * 获取 第 index 个 Originator 的备忘录对象(即保存状态)
     * @param index
     * @return
     */
    public Memento getMemento(int index) {
        return mementoList.get(index);
    }
}
package com.dozezz.designpattern.memento;

/**
 * 主测试类
 */
public class ClientTest {

    public static void main(String[] args) {
        CareTaker careTaker = new CareTaker();
        Originator originator = new Originator();
        originator.playGame();

        Memento memento = originator.createMemento();
        careTaker.addMemento(memento);

        originator.display();

        originator.playGame();

        Memento memento1 = originator.createMemento();

        careTaker.addMemento(memento1);

        originator.display();

        Memento memento2 = careTaker.getMemento(0);

        originator.recovery(memento2);

        originator.display();
    }
}

三、备忘录模式总结

3.1 备忘录的应用场景

  • 后悔药;
  • 打游戏存档;
  • 数据库的事务管理;

3.2 备忘录模式、命令模式区别

  • 命令模式中将“方法调用”这种命令行为或者说请求进一步的抽象,封装为一个对象,从而可以达到对请求记录的功能,进而可以实现撤销操作;
  • 备忘录模式也是为了记录对象的内部状态,为实现撤销操作做基础工作;
  • 命令模式侧重于请求历史的日志记录,能够记录操作的轨迹,然后调用命令接收者的撤销方法而撤销方法基本上需要对象的内部状态,备忘录模式则是举例对象的状态变化;

3.3 备忘录模式优缺点

  • 提供一种可以回复状态的机制。当用户需要时能够比较方便地将数据恢复到某个历史的状态;
  • 实现了内部状态的封装

四、参考文献

  • http://c.biancheng.net/view/1390.html
  • https://www.cnblogs.com/noteless/p/10178477.html
  • https://www.bilibili.com/video/BV1G4411c7N4?p=54&spm_id_from=pageDriver

你可能感兴趣的:(设计模式,设计模式,java)