java memento,在Java中实现Memento Pattern的不同方式

I am doing some research into the Memento Pattern and it seems that most of the examples I have come across seem to be relatively similar (Saving a String into an array and restoring it when needed) now correct me if I am wrong but I believe the method that i just described is "Object Cloning" but what are the other ways of implementing the Memento Pattern?

From what I have also picked up on Serialization can be used but there seems to be a grey area with people saying that it violates the encapsulation of the object and isn't a way to implement to Memento Pattern due to this.

So will anybody be able to shed some light on the ways to implement the pattern? My research has came up with a sort of mixture of all different things and has just made everything confusing.

Thanks

解决方案

The Java Collections framework defines Queue, which can help.

Candidate code:

public final class Memento

{

// List of saved values

private final Queue queue = new ArrayDeque();

// Last entered value, whether it has been saved or not

private T currentValue;

// No initial state, ie currentValue will be null on construction, hence

// no constructor

// Set a value, don't save it

public void set(final T value)

{

currentValue = value;

}

// Persist the currently saved value

public void persist()

{

queue.add(currentValue);

}

// Return the last saved value

public T lastSaved()

{

return queue.element();

}

// Return the last entered value

public T lastEntered()

{

return currentValue;

}

}

Notably missing from this code are many things, but are easily implementable:

revert to the last saved value;

no check for nulls;

T does not implement Serializable;

convenience method (like, add a value and make it the last saved state);

code is not thread safe!

Etc.

Sample code:

public static void main(final String... args)

{

final Memento memento = new Memento();

memento.set("state1");

System.out.println(memento.lastEntered()); // "state1"

memento.persist();

memento.set("state2");

System.out.println(memento.lastEntered()); // "state2"

System.out.println(memento.lastSaved()); // "state1"

}

In effect: this is a braindead implementation which can be improved, but which can be used as a basis -- extending it depends on your needs ;)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值