java设计模式——备忘录模式

       备忘录模式:又叫做快照模式,指在不破坏封装性的前提下,获取到一个对象的内部状态,并在对象之外记录或保存这个状态。在有需要的时候可将该对象恢复到原先保存的状态。我们相当于把对象原始状备份保留,所以叫备忘录模式。
模式 角色对象组成:
1.发起者对象:负责创建一个备忘录来记录当前对象的内部状态,并可使用备忘录恢复内部状态。
2.备忘录对象:负责存储发起者对象的内部状态,并防止其他对象访问备忘录。
3.管理者对象:负责备忘录权限管理,不能对备忘录对象的内容进行访问或者操作。

    优点:
    1、备忘录模式可以把发起人内部信息对象屏蔽起来,从而可以保持封装的边界。
    2、简化了发起人类。当发起人角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原。
    缺点:
    1、如果状态需要完整地存储到备忘录对象中,那么在资源消耗上面备忘录对象比较昂贵。
    2、当发起者对象的状态改变的时候,有可能这个协议无效。如果状态改变的成功率达不到要求,可以考虑采取“假如”协议模式。

备忘录在jsp+javabean的使用:
在一系统中新增帐户时,在表单中需要填写用户名、密码、联系电话、地址等信息,如果有些字段没有填写或填写错误,当用户点击“提交”按钮时,需要在新增页面上保存用户输入的选项,并提示出错的选项。这就是利用JavaBean的scope="request"或scope="session"特性实现的,即是用备忘录模式实现的。

package com.lzh;



public class Person {
	private String name;
	private String sex;
	private int    age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	public Person(String name, String sex, int age) {
		super();
		this.name = name;
		this.sex = sex;
		this.age = age;
	}
	public Person() {
		
		// TODO Auto-generated constructor stub
	}
	public void display() {
		// TODO Auto-generated method stub
		System.out.println(" name "+name+" sex "+sex+" age "+age);
	}
	  //创建一个备份
    public Memento createMemento(){  
        return new Memento(name, sex, age);  
    }  
      //恢复一个备份
    public void restoreMemento(Memento memento) {
		// TODO Auto-generated method stub
    	this.name=memento.getName();
    	this.sex = memento.getSex();
    	this.age = memento.getAge();
	}
}
package com.lzh;

public class Memento {
	private String name;
	private String sex;
	private int    age;
	public Memento(String name, String sex, int age) {
		
		this.name = name;
		this.sex = sex;
		this.age = age;
	}
	
	public Memento() {
		super();
		// TODO Auto-generated constructor stub
	}

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}
package com.lzh;

public class Caretaker {
	private Memento memento;

	public Memento getMemento() {
		return memento;
	}

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

public class Mainclass {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Person person = new Person("zhangsan","nan",20);
		
		//Memento memento = person.createMemento();
		Caretaker caretaker = new Caretaker();
		caretaker.setMemento(person.createMemento());
		
		person.display();
		
		person.setName("lisi");
		person.setSex("nv");
		person.setAge(23);
		
		person.display();
		
		person.restoreMemento(caretaker.getMemento());
		person.display();
		
	}

}

(i)Memento:备忘录角色,  主要负责的工作如下:
将发起人对象的内部状态存储起来;
可以保护其内容不被发起人(Originator)对象之外的任何对象所读取。
(ii)Originator:发起人角色,主要完成如下工作:
创建一个含有当前的内部状态的备忘录对象;
使用备忘录对象存储其内部状态。
(iii)Caretaker:负责人角色,完成工作如下:
负责保存备忘录对象;
不保存备忘录对象的内容。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值