我在另一个网站上的文章:
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);
}
分享到:
相关推荐
中高级内容则深入探讨如何理解这些模式,包括模式中蕴涵什么样的设计思想,模式的本质是什么,模式如何结合实际应用,模式的优缺点以及与其他模式的关系等,以期让读者尽量去理解和掌握每个设计模式的精髓所在。...
第12章介绍如何将两个以上的设计模式结合起来成为新的设计模式(例如著名的MVC模式),作者称其为复合设计模式(这是作者自创的名称,并非四人组的标准名词),第13章则很快地浏览尚未介绍的设计模式,包括Bridge、...
《Java与模式》这本书是专为中国读者打造的一本设计模式指南,它巧妙地结合了Java编程语言和中国传统文化,特别是道家哲学,为理解和应用设计模式提供了独特的视角。设计模式是软件工程中的一种最佳实践,它总结了在...
3. **行为型模式**:包括策略(Strategy)、模板方法(Template Method)、观察者(Observer)、迭代器(Iterator)、访问者(Visitor)、责任链(Chain of Responsibility)、命令(Command)、备忘录(Memento)、...
中高级内容则深入探讨如何理解这些模式,包括模式中蕴涵什么样的设计思想,模式的本质是什么,模式如何结合实际应用,模式的优缺点以及与其他模式的关系等,以期让读者尽量去理解和掌握每个设计模式的精髓所在。...
5. Prototype模式,原型模式,用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。 结构型模式部分包括: 1. Bridge模式,桥接模式,将抽象部分与实现部分分离,使它们都可以独立地变化。 2. ...
Prototype模式用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。 - **适用场景**:当一个类的实例只能有几个不同状态组合中的一种时非常有用。 ### 2 结构型模式 结构型模式处理如何组装类和...
包括策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、迭代器模式(Iterator)、访问者模式(Visitor)、...备忘录模式(Memento)、状态模式(State)和解释器模式(Interpreter)...
本书创造性地将这些模式分为5大类别,以充分展现各个模式的重要特征,并结合uml类图与对应的java程序,便于读者更好地理解。全书给出了大量的练习,作为对读者的挑战,以启发思考,督促读者通过实践练习的方式来掌握...
包括策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、迭代器模式(Iterator)、命令模式(Command)、责任链模式(Chain of Responsibility)、备忘录模式(Memento)、状态模式...
- 备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后恢复。 - 观察者模式(Observer):定义对象之间的一对多依赖关系,当一个对象的状态改变时,...
总之,《刘艺模式编程附书源码》是一个宝贵的教育资源,它将理论与实践相结合,是你提升编程能力、深入理解编程模式的理想参考资料。通过深入研究这份源码,你将在编程世界中走得更远,成为一名更出色的开发者。
- **行为型模式**:责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介者模式(Mediator)、备忘录模式(Memento)、观察者模式(Observer)...
C#作为.NET框架下的主要编程语言,其特性与设计模式相结合,可以实现高效、优雅的代码编写。例如,C#的接口(Interface)支持多继承,使得实现策略模式或装饰器模式变得简单;而委托(Delegate)和事件(Event)机制...
装饰模式与策略模式结合,可以在运行时改变对象的行为策略。 总结来说,李建忠先生的“设计模式总结”涵盖了C#中广泛使用的设计模式,强调了它们在实际项目中的应用价值。理解并熟练运用这些模式,对于提升C#开发者...
该资料不仅详细解析了每种模式的概念、目的和适用场景,还提供了C++语言的具体实现案例,为读者提供了理论与实践相结合的学习资源。 ### 创建型模式 #### Factory模式 Factory模式是一种用于创建对象的接口,它...
包括策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、迭代器模式(Iterator)、命令模式(Command)、责任链模式(Chain of Responsibility)、备忘录模式(Memento)、状态模式...
例如,适配器模式可以与工厂模式结合,以创建适应不同接口的对象;装饰器模式可以与组合模式一起使用,来动态地增加或减少对象的功能。 学习和理解这21种设计模式,对于任何程序员来说都是至关重要的,无论是在Java...
第12章介绍如何将两个以上的设计模式结合起来成为新的设计模式(例如著名的MVC模式),作者称其为复合设计模式(这是作者自创的名称,并非四人组的标准名词),第13章介绍如何进一步学习设计模式,如何发觉新的设计模式...
行为型模式涉及对象间的交互和责任分配,如策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、迭代器模式(Iterator)、命令模式(Command)、备忘录模式(Memento)、状态模式...