队列+备忘录模式

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

}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值