设计模式之备忘录模式

首先设计一个抽象发起人类,一个具体发起人类继承该抽象类,一个备忘录接口,一个管理者抽象类,一个具体管理者类继承该抽象类,最后是客服端主类。发起人抽象类实现备忘录类,管理者抽象类聚合备忘录类。

备忘录类:

package com.freshbin.pattern.memento.myexample.memento;

/**
 * 备忘录接口
 * 
 * @author freshbin
 * @date 2019年1月20日 上午11:20:35
 */
public interface Memento {

}

发起人抽象类:

package com.freshbin.pattern.memento.myexample.originator;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

import com.freshbin.pattern.memento.myexample.memento.Memento;

/**
 * 发起人接口
 * 
 * @author freshbin
 * @date 2019年1月20日 上午11:21:43
 */
public abstract class Originator implements Serializable, Cloneable{
	protected String id;
	protected Integer level;

	public Originator(String id, Integer level) {
		this.id = id;
		this.level = level;
	}

	public Memento createMemento() throws CloneNotSupportedException {
		return new MemetoInner(this);
	}

	public Originator restoreMemento(Memento memento) throws CloneNotSupportedException {
		Originator originator = ((MemetoInner) memento).restoreMemento();
		return (Originator)originator.clone();
	}
	
	private class MemetoInner implements Memento {
		private Originator originator;

		public MemetoInner(Originator originator) throws CloneNotSupportedException {
			this.originator = (Originator) originator.clone();
		}
		
		public Originator restoreMemento() {
			return originator;
		}
	}

	public Integer getLevel() {
		return level;
	}

	public void setLevel(Integer level) {
		this.level = level;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}
}

发起人子类

package com.freshbin.pattern.memento.myexample.originator;

public class OriginatorA extends Originator {

	public OriginatorA(String id, Integer level) {
		super(id, level);
	}
}

管理者抽象类:

package com.freshbin.pattern.memento.myexample.carertaker;

import java.util.HashMap;
import java.util.Map;

import com.freshbin.pattern.memento.myexample.memento.Memento;

/**
 * 管理者接口
 * 
 * @author freshbin
 * @date 2019年1月20日 上午11:23:02
 */
public abstract class Caretaker {
	public Map<String, Memento> mementorMap;
	
	public Caretaker() {
		this.mementorMap = new HashMap<>(16);
	}
	
	public void saveMementor(String id, Memento mementor) {
		mementorMap.put(id, mementor);
	}
	
	public Memento retrieveMemento(String id) {
		return mementorMap.get(id);
	}

	public Map<String, Memento> getMementorMap() {
		return mementorMap;
	}
	
}

管理者子类:

package com.freshbin.pattern.memento.myexample.carertaker;

/**
 * 管理类子类
 * 
 * @author freshbin
 * @date 2019年1月20日 上午11:47:46
 */
public class ConcreteCaretakerA extends Caretaker {

}

客户端主类:

package com.freshbin.pattern.memento.myexample;

import com.freshbin.pattern.memento.myexample.carertaker.Caretaker;
import com.freshbin.pattern.memento.myexample.carertaker.ConcreteCaretakerA;
import com.freshbin.pattern.memento.myexample.originator.Originator;
import com.freshbin.pattern.memento.myexample.originator.OriginatorA;

/**
 * 备忘录模式
 * 
 * @author freshbin
 * @date 2019年1月20日 上午11:13:36
 */
public class MementoPatternDemo {
	public static void main(String[] args) throws CloneNotSupportedException {
		Caretaker caretaker = new ConcreteCaretakerA();
		Originator originatorA = new OriginatorA("1", 1);
		// 存档
		caretaker.saveMementor(originatorA.getId(), originatorA.createMemento());
		// 升级
		originatorA.setLevel(2);
		System.out.println("当前等级:" + originatorA.getLevel());

		//读取存档
		originatorA = originatorA.restoreMemento(caretaker.getMementorMap().get(originatorA.getId()));
		System.out.println("读取存档后的等级:" + originatorA.getLevel());
		
		//再升级
		originatorA.setLevel(3);
		System.out.println("当前等级:" + originatorA.getLevel());
		//读取存档
		originatorA = originatorA.restoreMemento(caretaker.getMementorMap().get(originatorA.getId()));
		System.out.println("读取存档后的等级:" + originatorA.getLevel());
	}
}

效果:

github地址:https://github.com/freshbin/designPattern

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值