zoukankan      html  css  js  c++  java
  • 【设计模式】行为型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


  • 相关阅读:
    AC日记——与7无关的数 openjudge 1.5 39
    AC日记——计算多项式的导函数 openjudge 1.5 38
    AC日记——矩阵交换行 openjudge 1.8 01
    AC日记——阶乘和 openjudge 1.6 15
    AC日记——求10000以内n的阶乘 openjudge 1.6 14
    逻辑运算
    PLC控制设计的基本步骤
    Micropython通用控制
    class Pin --控制I/O引脚
    Micropython入门实操心得
  • 原文地址:https://www.cnblogs.com/the-fool/p/11054146.html
Copyright © 2011-2022 走看看