zoukankan      html  css  js  c++  java
  • 设计模式之备忘录模式(行为型)

    一、模式定义

    备忘录模式(Memento Pattern):备忘录模式的定义是在不破坏封装的前提下,捕获一个对象的内部状态,并将该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。所以备忘录模式就是一种对象行为型模式。

    二、模式角色

    备忘录模式包括下面角色

    • Originator(原发器)
    • Memento(备忘录)
    • Caretaker(负责人)

    在这里插入图片描述

    备忘录模式包括原发器类,备忘录类和负责人类。原发器可以创建一个备忘录,备忘录类存储原发器类的内部状态,根据原发器来决定保存哪些内部状态,负责人类负责保存备忘录

    三、模式分析

    备忘录模式主要应用于备份或者回退操作,为了使软件使用更友好,通常都有回退功能,软件一般也要提供回退机制,而要实现回退,就必须事先备份好状态信息,所以有了备忘录模式就有实现系统回退到某一个特定的历史状态。

    备忘录对象用于存储另外一个对象内部状态的快照对象,所以备忘录模式又可以称之为快照模式(Snapshot Pattern)或Token模式

    典型代码:

    原发器类:

    public class Originator {
      private String state;
      public Originator(){}
      // 创建一个备忘录对象
      public Memento createMemento(){
        return new Memento(this);
      }
      // 根据备忘录对象恢复原发器状态
      public void restoreMemento(Memento m){
         state = m.state;
        }
        public void setState(String state)
        {
            this.state=state;
        }
        public String getState()
        {
            return this.state;
        }
    }
    
    

    备忘录类:

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

    负责人类:

    import java.util.ArrayList;
    import java.util.List;
     
    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);
       }
    }
    

    四、模式例子

    实例:用户信息操作撤销
    某系统提供了用户信息操作模块,用户可以修改自己的各项信息。为了使操作过程更加人性化,现使用备忘录模式对系统进行改进,使得用户在进行了错误操作之后可以恢复到操作之前的状态。

    本例子来自《设计模式》一书

    原发器类,创建备忘录类

    package dp.memento;
    
    public class UserInfoDTO
    {
    	private String account;
    	private String password;
    	private String telNo;
    	
    	public String getAccount()
    	{
    		return account;
    	}
    	
    	public void setAccount(String account)
    	{
    		this.account=account;
    	}
    
    	public String getPassword()
    	{
    		return password;
    	}
    	
    	public void setPassword(String password)
    	{
    		this.password=password;
    	}
    	
    	public String getTelNo()
    	{
    		return telNo;
    	}
    	
    	public void setTelNo(String telNo)
    	{
    		this.telNo=telNo;
    	}
    		
    	public Memento saveMemento()
    	{
    		return new Memento(account,password,telNo);
    	}
    	
    	public void restoreMemento(Memento memento)
    	{
    		this.account=memento.getAccount();
    		this.password=memento.getPassword();
    		this.telNo=memento.getTelNo();
    	}
    	
    	public void show()
    	{
    		System.out.println("Account:" + this.account);
    		System.out.println("Password:" + this.password);
    		System.out.println("TelNo:" + this.telNo);		
    	}
    }
    

    备忘录类,保存原发器类状态:

    package dp.memento;
    
    class Memento
    {
    	private String account;
    	private String password;
    	private String telNo;
    	
    	public Memento(String account,String password,String telNo)
        {
        	this.account=account;
        	this.password=password;
        	this.telNo=telNo;
        }
    	public String getAccount()
    	{
    		return account;
    	}
    	
    	public void setAccount(String account)
    	{
    		this.account=account;
    	}
    
    	public String getPassword()
    	{
    		return password;
    	}
    	
    	public void setPassword(String password)
    	{
    		this.password=password;
    	}
    	
    	public String getTelNo()
    	{
    		return telNo;
    	}
    		
    	public void setTelNo(String telNo)
    	{
    		this.telNo=telNo;
    	}
    }
    

    负责人类,创建备忘录:

    package dp.memento;
    
    public class Caretaker
    {
    	private Memento memento;
    	public Memento getMemento()
    	{
    		return memento;
    	}
    	public void setMemento(Memento memento)
    	{
    		this.memento=memento;
    	}
    }
    

    五、模式应用

    • 软件里的存档操作
    • Windows 里的 ctri + z。
    • IE 中的后退操作
    • 数据库的事务管理
      ....
    IT程序员
  • 相关阅读:
    java的构造方法 this 重载
    容器,组件,面板
    首先定义一个5X8的二维数组,然后使用随机数填充满。借助Arrays的方法对二维数组进行排序。
    首先创建一个长度是5的数组,并填充随机数。首先用选择法正排序,然后再对其使用冒泡法倒排序
    创建一个长度是5的数组,并填充随机数。使用for循环或者while循环,对这个数组实现反转效果
    寻找某两个数相除,其结果 离黄金分割点 0.618最近,分母和分子不能同时为偶数 * 分母和分子 取值范围在[1-20]
    密码的自动生成器:密码由大写字母/小写字母/数字组成,生成12位随机密码
    vue倒计时:天时分秒
    tbody设置超出固定的高度出现滚动条,没超出不显示。
    获取某个日期的当前周一的时间
  • 原文地址:https://www.cnblogs.com/mzq123/p/10542519.html
Copyright © 2011-2022 走看看