设计模式之备忘录模式

备忘录模式

  1. 备忘录模式原型图:

  2. 示例代码:

    // 抽象备忘录接口
    public interface Memento {
    }
    
    // 发起人角色
    @Data
    public class Originator {
    
        private String status;
    
        public Originator(String status) {
            this.status = status;
        }
    
        public Memento createMemento(){
            ConcreteMemento memento = new ConcreteMemento();
            memento.setStatus(this.status);
            return memento;
        }
    
        public void restoreMemento(Memento memento){
            this.status = ((ConcreteMemento) memento).getStatus();
        }
    
        // 备忘录角色
        @Data
        private static class ConcreteMemento implements Memento{
            private String status;
        }
    }
    
    // 备忘录管理员角色
    public class Caretaker {
    
        private final Stack<Memento> stack = new Stack<>();
    
        public Memento getMemento(){
            return stack.pop();
        }
    
        public void addMemento(Memento memento){
            stack.push(memento);
        }
    }
    
    // 测试
    public class MementoTest {
    
        public static void main(String[] args) {
            Caretaker caretaker = new Caretaker();
            Originator originator = new Originator("开始状态");
            caretaker.addMemento(originator.createMemento());
            System.out.println(originator);
            originator.setStatus("第一次修改状态");
            caretaker.addMemento(originator.createMemento());
            System.out.println(originator);
            originator.setStatus("第二次修改状态");
            caretaker.addMemento(originator.createMemento());
            System.out.println(originator);
            System.out.println("======开始恢复状态===========");
            originator.restoreMemento(caretaker.getMemento());
            System.out.println(originator);
            originator.restoreMemento(caretaker.getMemento());
            System.out.println(originator);
            originator.restoreMemento(caretaker.getMemento());
            System.out.println(originator);
    
        }
    }
    
    
  3. 总结:上述示例备忘录角色采用了私有静态内部类实现抽象接口的方式,主要是保证备忘录对发起人开放,具有宽访问权限,对其他类(Caretaker)对Memento具有窄访问权限.

    优点:简化了发起人实体类的职责,隔离状态的存储与获取,实现了信息的封装,并提供了状态回滚功能;

    缺点:消耗资源.

posted @ 2021-04-27 08:14  justKen  阅读(41)  评论(0编辑  收藏  举报