zoukankan      html  css  js  c++  java
  • 备忘录模式

    设计模式没有具体的落地代码,写着总感觉是抽象的概念而已


    1. 备忘录模式(Memento Pattern)

    在不违反封装的情况下保存、获取对象的内部状态,然后在需要的时候可以恢复之前的状态。应用在存档、回退操作(ctrl + z、浏览器回退)


    备忘录模式的组成:

    • Originator:发起者
    • Memento:存储状态的对象
    • CareTaker:状态的管理器




    2. 流程

    流程的背景:模拟游戏内的存档,然后在需要的时候回退


    2.1 Originator

    public class Originator {
    
        // 发起者内部状态(可有多个属性,这里为了简洁只写一个,用来表示角色等级)
        private String state;
    
        public String getState() {
            return state;
        }
    
        public void setState(String state) {
            this.state = state;
        }
    
        // 创建内部的状态
        public Memento createMemento() {
            return new Memento(this.state);
        }
    
        // 回退操作
        public void setMemento(Memento memento) {
            this.state = memento.getState();
        }
    }
    


    2.2 Memento

    用于保存状态,也就是存档

    public class Memento {
        private String state;
    
        public Memento(String state) {
            this.state = state;
        }
    
        public String getState() {
            return state;
        }
    }
    


    2.3 CareTaker

    存档的管理器,内部有多个状态

    public class CareTaker {
        Map<String, Memento> map = new HashMap<>();
    
        public void add(String name, Memento memento) {
            map.put(name, memento);
        }
    
        public Memento get(String name) {
            return map.get(name);
        }
    }
    


    2.4 测试

    public class Test {
        public static void main(String[] args) {
    
            Originator originator = new Originator();
            CareTaker careTaker = new CareTaker();
    
            // 角色刚进新手村,等级为 1
            originator.setState("1");
            careTaker.add("2021-10-1", originator.createMemento());
            
            // 新手村毕业了,等级为 10
            originator.setState("10");
            careTaker.add("2021-11-1", originator.createMemento());
            
            // 游戏通关了,等级为 99
            originator.setState("99");
            careTaker.add("2021-12-1", originator.createMemento());
    
            // 通关时的等级,1
            System.out.println(originator.getState());
    
            // 回档1,回到新手村,10
            originator.setMemento(careTaker.get("2021-10-1"));
            System.out.println(originator.getState());
    
            // 回档2,回到新手村毕业,99
            originator.setMemento(careTaker.get("2021-11-1"));
            System.out.println(originator.getState());
        }
    }
    


  • 相关阅读:
    轮播 margin-left实现
    点击按钮切换图片
    运用把不同的方式排版,涉及到float box-flox box-orient
    chrome中font-size<12px时并不更改字体大小仍未12px
    js实现跑马灯
    支付宝支付集成
    前端技术博客
    在iphone5/5s出现界面显示不全,大小为iphone4/4s 的问题
    UIImage使用总结
    在IOS开发中使用自定义的字体
  • 原文地址:https://www.cnblogs.com/Howlet/p/15717625.html
Copyright © 2011-2022 走看看