队列+备忘录模式

来源:互联网 发布:格子分类信息网站源码 编辑:程序博客网 时间:2024/05/21 17:14

在使用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;    }}

这样就可以较好的实现业务了

原创粉丝点击