java--备忘录模式

概述

Memento模式,也叫备忘录模式,是行为模式之一,他的作用是保存对象的内部状态,并在需要的时候(undo/rollback)恢复对象以前的状态.

备忘录模式的应用场景

如果一个对象需要保存状态,并可以通过undo或rollback等操作恢复到之前的状态时,可以使用备忘录模式

  1. 一个类需要保存他的对象状态(相当于originator角色)
  2. 设计一个类用来保存上述对象的状态,这个类的属相要和要备份的类属性结构一致提供getset方法(相当于memento角色)
  3. 在这个需要保存他的类中提供保存备份的方法,和恢复方法

备忘录模式的角色和职责

originator 原生者   需要被保存状态以便恢复的对象

memento 备忘录 该对象由originator 创建主要用来保存originator

caretaker 管理者 负责在适当的时间保存恢复originator对象

 

originator 类

package cn.bufanli.designPatterns.pojo;

/**
 * @author BuShuangLi
 * @date 2019/4/18
 */
public class Person {
	/**
	 * 姓名
	 */
	private String name;
	/**
	 * 性别
	 */
	private  String sex;
	/**
	 * 年龄
	 */
	private int age;
	public Person(){}
	public Person(String name, String sex, int age) {
		this.name = name;
		this.sex = sex;
		this.age = age;
	}
	/**
	 * 创建备份方法
	 * @return
	 */
	public Memento creatMemento(){
		Memento memento = new Memento();
		memento.setAge(age);
		memento.setName(name);
		memento.setSex(sex);
		return memento;
	}
	/**
	 * 恢复备份方法
	 * @return
	 */
	public void setMemento(Memento memento){
		this.name=memento.getName();
		this.age=memento.getAge();
		this.sex=memento.getSex();
	}

   get&&set&&toString 略
}

memento

package cn.bufanli.designPatterns.pojo;

/**
 * @author BuShuangLi
 * @date 2019/4/18
 */
public class Memento {
	/**
	 * 姓名
	 */
	private String name;
	/**
	 * 性别
	 */
	private  String sex;
	/**
	 * 年龄
	 */
	private int age;
    get&&set 略
}

Caretaker

package cn.bufanli.designPatterns.pojo;

/**
 * @author BuShuangLi
 * @date 2019/4/18
 */
public class Caretaker {
	private Memento memento;

	public Memento getMemento() {
		return memento;
	}

	public void setMemento(Memento memento) {
		this.memento = memento;
	}
}

 

 

 

package cn.bufanli.designPatterns;

import cn.bufanli.designPatterns.pojo.Caretaker;
import cn.bufanli.designPatterns.pojo.Memento;
import cn.bufanli.designPatterns.pojo.Person;
import org.junit.Test;

/**
 * @author BuShuangLi
 * @date 2019/4/18
 * 设计模式--备忘录模式originator
 */
public class MementoTest {
	/**
	 * 原始
	 */
	@Test
	public void test01() {
		//实例化对象
		Person person = new Person("张三", "男", 20);
		//保存内部状态
		Person backUp = new Person();
		backUp.setName(person.getName());
		backUp.setAge(person.getAge());
		backUp.setSex(person.getSex());
		System.out.println(person.toString());
		//修改
		person.setAge(30);
		System.out.println(person.toString());
		//回滚 还原
		person.setAge(backUp.getAge());
		System.out.println(person.toString());
	}

	/**
	 * 加入备份类Memento 
	 */
	@Test
	public void test02() {
		//实例化对象
		Person person = new Person("张三", "男", 20);
		//创建备份类
		Memento memento = person.creatMemento();
		System.out.println(person.toString());
		//修改
		person.setAge(1);
		person.setSex("女");
		person.setName("李思");
		System.out.println(person.toString());
		//恢复
		person.setMemento(memento);
		System.out.println(person.toString());


	}
	/**
	 * 加入管理者后的Caretaker 
	 */
	@Test
	public void test03() {
		//实例化对象
		Person person = new Person("张三", "男", 20);
		//创建管理者
		Caretaker caretaker = new Caretaker();
		//设置备忘录
		caretaker.setMemento(person.creatMemento());
		System.out.println(person.toString());
		//修改
		person.setAge(1);
		person.setSex("女");
		person.setName("李思");
		System.out.println(person.toString());
		//恢复
		person.setMemento(caretaker.getMemento());
		System.out.println(person.toString());


	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值