纪念品设计模式

Memento模式是一种行为设计模式。Memento模式用于将对象的状态恢复到以前的状态。随着应用程序的运行,您可能希望在应用程序中保存检查点,并在以后恢复到这些检查点。

null

UML图Memento设计模式

Memento-Diagram

设计组件

  • 发起人: 要为其保存状态的对象。它创建了纪念品,并在将来使用它来撤销。
  • 纪念品: 将要保持发起者状态的对象。这只是一个POJO。
  • 管理员: 跟踪多个纪念品的对象。比如维持储蓄点。

A. 看门人 想在手术台上做手术吗 发起者 同时有可能回滚。看门人打电话给警察 createMemento() 方法,要求发起者将纪念品传递给发起者。此时,发起者创建了一个纪念品对象,保存其内部状态,并将纪念品传递给管理员。管理员负责维护纪念品并执行操作。如果需要撤消操作,管理员会致电 setMemento() 方法对传递维护的memento对象的发起人。发起者会接受纪念品,用它来恢复它以前的状态。

我们来看一个Memento设计模式的例子。

import java.util.List;
import java.util.ArrayList;
class Life
{
private String time;
public void set(String time)
{
System.out.println( "Setting time to " + time);
this .time = time;
}
public Memento saveToMemento()
{
System.out.println( "Saving time to Memento" );
return new Memento(time);
}
public void restoreFromMemento(Memento memento)
{
time = memento.getSavedTime();
System.out.println( "Time restored from Memento: " + time);
}
public static class Memento
{
private final String time;
public Memento(String timeToSave)
{
time = timeToSave;
}
public String getSavedTime()
{
return time;
}
}
}
class Design
{
public static void main(String[] args)
{
List<Life.Memento> savedTimes = new ArrayList<Life.Memento>();
Life life = new Life();
//time travel and record the eras
life.set( "1000 B.C." );
savedTimes.add(life.saveToMemento());
life.set( "1000 A.D." );
savedTimes.add(life.saveToMemento());
life.set( "2000 A.D." );
savedTimes.add(life.saveToMemento());
life.set( "4000 A.D." );
life.restoreFromMemento(savedTimes.get( 0 ));
}
}


输出:

Setting time to 1000 B.C.
Saving time to Memento
Setting time to 1000 A.D.
Saving time to Memento
Setting time to 2000 A.D.
Saving time to Memento
Setting time to 4000 A.D.
Time restored from Memento: 1000 B.C.

有利条件

  • 我们可以使用序列化来实现更通用的memento模式实现,而不是每个对象都需要有自己的memento类实现的memento模式。

缺点

  • 如果发起者对象非常大,那么Memento对象的大小也将非常大,并且会占用大量内存。

进一步阅读—— Python中的Memento方法

本文由 萨凯特·库马尔 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 写极客。组织 或者把你的文章寄去评论-team@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。

如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享