• 【设计模式】行为型07备忘录模式(Memento Pattern)


    参考地址:http://www.runoob.com/design-pattern/memento-pattern.html
    对原文总结调整,以及修改代码以更清晰的展示:

    备忘录模式(快照模式):

            定义:顾名思义,备忘录模式是在不破坏封装性的前提下,通过备忘录对象,记录一个对象的内部状态,并在该对象之外保存这个状态。


            应用场景 2、打游戏时的存档。 3、Windows 里的 ctri + z。 4、IE 中的后退。 4、数据库的事务管理。


    图:日后再画

    代码:

    1、状态记录类:

    package com.pat.snap;
    /**
     * 备忘录对象,用于记录
     * @author Administrator
     *
     */
    public class Memento {
    	private String text="";
    
    	public String getText() {
    		return text;
    	}
    
    	public void setText(String text) {
    		this.text = text;
    	}
    	
    }
    

    2、编辑器-被记录类

    package com.pat.snap;
    /**
     * 记事本对象,被记录的对象
     * @author Administrator
     *
     */
    public class TextEditor {
    	//正在编辑的内容
    	private String text="";
    
    	public String getText() {
    		return text;
    	}
    
    	public void setText(String text) {
    		this.text = this.text+text;
    	}
    	//保存
    	public Memento saveHistory() {
    		Memento curr = new Memento();
    		curr.setText(this.text);
    		return curr;
    	}
    	//ctrl+z
    	public void backUp(Memento mem) {
    		this.text=mem.getText();
    	}
    	
    }
    

    3、存储记录

    package com.pat.snap;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 管理历史,负责恢复
     * @author Administrator
     *
     */
    public class CareTaker {
    	private List<Memento> mementoList = new ArrayList<Memento>();
    
    	   public void add(Memento state){
    	      mementoList.add(state);
    	   }
    
    	   public Memento get(int index){
    	      return mementoList.get(index);
    	   }
    
    }
    

    4、测试类

    package com.pat.snap;
    /**
     * 测试类
     * @author ZX
     *
     */
    public class Test {
    	public static void main(String[] args) {
    		//创建历史记录管理类
    		CareTaker ct =new CareTaker();
    		//记事本编辑文件
    		TextEditor td = new TextEditor();
    		td.setText("123");
    		td.setText("456");
    		//创建快照1
    		Memento h1 = td.saveHistory();
    		ct.add(h1);
    		td.setText("789");
    		td.setText("10");
    		td.setText("11");
    		
    		//创建快照2
    		Memento h2 = td.saveHistory();
    		ct.add(h2);
    		//获取快照1
    		Memento memento1 = ct.get(0);
    		System.out.println(memento1.getText());
    		//获取快照2
    		Memento memento2 = ct.get(1);
    		System.out.println(memento2.getText());
    		
    		
    	}
    }

    5、运行结果:

    123456
    1234567891011


  • 相关阅读:
    java获取两个日期之间的所有日期
    java实现https免证书认证
    Linux系统下安装rz/sz命令及使用说明
    Linux 7 关闭、禁用防火墙服务
    Linux下iptables 禁止端口和开放端口
    JBPM4 常用表结构及其说明
    mysql索引使用技巧及注意事项
    MySQL的btree索引和hash索引的区别
    https://www.cnblogs.com/
    Git+Gitlab+Ansible剧本实现一键部署动态网站(二)--技术流ken
  • 原文地址:https://www.cnblogs.com/the-fool/p/11054146.html
Copyright © 2020-2023  润新知