设计模式之备忘录模式

内容抄自《设计模式》清华大学出版社,2011

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

结构分析:

包含角色:
1.Originator(原发器) 创建备忘录
2.Memento(备忘录)
3.Caretaker(负责人) 保存备忘录

模式分析:

public class Origin{
    private String state;
    public Memento save(){
        return new Memento(this);
    }
    public void recover(Memento m){
        this.state = m.state;
    }
}
class Memento{
    private String state;
    public Memento(Origin o){
        this.state = o.state;
    }
}
public class Caretaker{
    @Getter
    @Setter
    private Memento m;
}

优点:
1.提供了一种状态恢复的实现机制

缺点:
1.占用内存

适用环境:
1.保存一个对象的某个时刻的状态,可以恢复到先前的状态
2.一个对象不希望外界直接访问其内部状态,通过负责人可以间接访问其内部状态

Example:

public class Example {

	static class Hun{
		private int life;
		private int level;
		private int mala;
		public int getLife() {
			return life;
		}
		public void setLife(int life) {
			this.life = life;
		}
		public int getLevel() {
			return level;
		}
		public void setLevel(int level) {
			this.level = level;
		}
		public int getMala() {
			return mala;
		}
		public void setMala(int mala) {
			this.mala = mala;
		}
	}
	
	static class HunWrapper extends Hun{
		private Hun hun;
		public HunWrapper(Hun hun){
			this.hun = hun;
		}
		public Record save(int index){
			return new Record(hun,index);
		} 
		public void recover(Record r){
			hun.level = r.level;
			hun.life = r.life;
			hun.mala = r.mala;
			show();
		}
		public void kboss(){
			System.out.println("魂打boss");
			hun.life -= 5000;
			hun.mala -= 3000;
			show();
		}
		public void kbin(){
			System.out.println("魂打小兵");
			hun.life -= 1000;
			hun.mala -= 500;
			show();
		}
		public void show(){
			if(hun.life<=0){
				System.out.println("魂死了");
			}
			else{
				System.out.println("魂剩余血量:"+hun.life);
				System.out.println("魂剩余蓝量:"+hun.mala);
			}
		}
	}
	
	static class Record{
		private int life;
		private int level;
		private int mala;
		private int index;
		public Record(Hun hun,int index) {
			this.life = hun.life;
			this.level = hun.level;
			this.mala = hun.mala;
			this.index = index;
		}
		public int getLife() {
			return life;
		}
		public int getLevel() {
			return level;
		}
		public int getMala() {
			return mala;
		}
		public int getIndex() {
			return index;
		}
	}
	
	static class RecordKeeper{
		private List<Record> list;
		public RecordKeeper(){
			list = new ArrayList<>(10);
		}
		public Record getRecord(int index){
			return list.get(index);
		}
		public void setRecord(Record r){
			list.add(r.getIndex(), r);
		}
	}
	
	public static void main(String[] args) {
		Hun hun = new Hun();
		hun.level = 99;
		hun.life = 8888;
		hun.mala = 4512;
		
		HunWrapper hunEx = new HunWrapper(hun);
		RecordKeeper keeper = new RecordKeeper();
		
		hunEx.show();
		keeper.setRecord(hunEx.save(0));
		
		hunEx.kbin();
		keeper.setRecord(hunEx.save(1));
		
		hunEx.kbin();
		keeper.setRecord(hunEx.save(2));
		
		hunEx.kboss();
		
		hunEx.recover(keeper.getRecord(1));
		hunEx.recover(keeper.getRecord(2));
		hunEx.recover(keeper.getRecord(0));
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值