文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Memento模式与Prototype模式结合

2023-06-03 04:04

关注

我是菜鸟,刚开始学习设计模式,参考jdon的设计模式这本书,里面关于 Memento模式的例子如下(本人稍加修改)

[@more@]我在另一个网站上的文章:
http://www.matrix.org.cn/thread.shtml?topicId=5c99e4e2-90d7-11dc-b8c0-a384f0e97a57&forumId=20

我是菜鸟,刚开始学习设计模式,参考jdon的设计模式这本书,里面关于 Memento模式的例子如下(本人稍加修改):

1. 原始数据类

public class Originator {

protected int number = 0;
protected String file = null;

public Originator() {
}

public void setNumber(int number){
this.number = number;
}

public int getNumber(){
return number;
}

public void setFile(String file){
this.file = file;
}

public String getFile(){
return file;
}

// 创建一个Memento
public Memento getMemento() {
return new Memento(this);
}

// 恢复到原始值
public void setMemento(Memento m) {
number = m.number;
file = m.file;
}
}

2.储存类
public class Memento {

protected int number;
protected String file = null;

public Memento(Originator o) {
number = o.number;
file = o.file;
}
}

3.测试应用:
public void testMemento(){

Originator org = new Originator();
org.setNumber(10);
org.setFile("org_File");
Memento mem = new Memento(org);

org.setFile("new_File");
org.setNumber(20);

org.setMemento(mem);

assertEquals(org.getFile(),"org_File");
assertEquals(org.getNumber(),10);

}


测试ok! 可以恢复原来的值。页面应用中的session,还有数据层的持久层 感觉也用了这种方法。
缺点:如果数据量很大时,不仅写备份类不方便,而且也很耗费大,如果内部状态很多,再保存一份,无意要浪费大量内存.

想到以前学过的 Prototype 模式,结合如下:

1.原始类
public class Originator implements Cloneable {

protected int number = 0;
protected String file = null;

protected Originator org = null;//用于存储的类

public Originator() {

}

public void setNumber(int number) {
this.number = number;
}

public int getNumber() {
return number;
}

public void setFile(String file) {
this.file = file;
}

public String getFile() {
return file;
}

//取出原始值
public Originator getOriginator() {
return org;
}

//恢复到原始值
public void setOriginator() {
org =(Originator)this.clone();
}

//prototype 方法
public Object clone() {
Object object = null;
try {
object = super.clone();
} catch (CloneNotSupportedException exception) {
System.err.println("Originator is not Cloneable");
}
return object;
}
}

2.测试类如下:
public void testPrototype(){
Originator org = new Originator();
org.setNumber(10);
org.setFile("org_File");

//Memento mem = new Memento(org);

org.setOriginator();//将原数据放入存储类中

org.setFile("new_File");
org.setNumber(20);

///org.setMemento(mem);

org.getOriginator();//得到原来值
///org.setMemento(mem);

assertEquals(org.getOriginator().getFile(),"org_File");
assertEquals(org.getOriginator().getNumber(),10);
}

结果一样,这里简单了类的编写,不过可能 还是要浪费内存。
阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯