在使用Eclipse编写代码时,经常会用到Ctrl+Z 回到之前的某一个状态,提现在java上的就是备忘录模式,然而eclipse备忘时会有一个限制的大小,不会一直记住你很多步之前的操作是什么样的,按照我的理解是把用户的动作塞在一个限制大小的队列中,先入先出。
下面直接贴上我的代码:
- 队列工具类QueueUtils
public class QueueUtils<E> {
//限制大小
private int limit;
//使用链表作为队列
private LinkedList<E> list = new LinkedList<E>();
public QueueUtils(int i){
limit = i;
}
//先入先出
public void offer(E e){
if(list.size()>=limit){
list.poll();
}
list.offer(e);
}
//遍历队列中的内容
public void iterator(){
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
}
//得到最后实现的动作,并移除
public String getLastAction(){
String str = (String) list.get(list.size()-1);
list.remove(list.size()-1);
return str;
}
}
- 发起者角色Originator
public class Originator {
//动作
private String action;
public String getAction() {
return action;
}
public void setAction(String action) {
this.action = action;
}
//做事情,将创建备忘录的动作放在其中
public void createMemento(Memento memento){
memento.recordMemento(action);
}
//读档(ctrl+z)
public void restoreLastAction(Memento memento){
this.action = memento.queueMemento.getLastAction();
System.out.println("现在的动作为:---"+action);
}
}
- 备忘录角色Memento
public class Memento {
//固定长度为5
QueueUtils<String> queueMemento =new QueueUtils<String>(5);
public void recordMemento(String action){
this.queueMemento.offer(action);
}
}
- 客户端角色Client
public class Client {
public static void main(String[] args) {
Memento memento = new Memento();
Originator originator = new Originator();
originator.setAction("写了一行代码");
originator.createMemento(memento);
originator.setAction("删了半行");
originator.createMemento(memento);
originator.setAction("复制了七十八行代码");
originator.createMemento(memento);
originator.setAction("Ctrl+A,全部删除");
originator.createMemento(memento);
memento.queueMemento.iterator();
System.out.println("-------------");
//备忘最后一次操作
originator.restoreLastAction(memento);
originator.restoreLastAction(memento);
System.out.println("------------");
//队列里还剩下这些
memento.queueMemento.iterator();
}
}
现在代码就已经可以满足我们的业务需求了,但是显然备忘录模式的 负责人角色CareTaker 还没有发挥作用。稍作修改,其他对象不需改变,客户端改动如下:
- 客户端角色Client
public class Client {
public static void main(String[] args) {
Memento memento = new Memento();
Originator originator = new Originator();
originator.setAction("写了一行代码");
originator.createMemento(memento);
originator.setAction("删了半行");
originator.createMemento(memento);
originator.setAction("复制了七十八行代码");
originator.createMemento(memento);
originator.setAction("Ctrl+A,全部删除");
originator.createMemento(memento);
originator.setAction("删除类");
originator.createMemento(memento);
originator.setAction("删除项目");
originator.createMemento(memento);
memento.queueMemento.iterator();
Caretaker caker =new Caretaker(memento);
System.out.println("-------------");
//备忘最后一次操作
originator.restoreLastAction(caker.getMemento());
originator.restoreLastAction(caker.getMemento());
System.out.println("------------");
//队列里还剩下这些
memento.queueMemento.iterator();
}
}
- 负责人角色Caretaker
public class Caretaker {
private Memento memento;
public Memento getMemento() {
return memento;
}
public Caretaker(Memento memento) {
this.memento = memento;
}
}
这样就可以较好的实现业务了