⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mementopattern.htm

📁 DesignPattern基于Java方面最好的书
💻 HTM
字号:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>





  
  
  
  
  
  <link rel="stylesheet" href="css/stdlayout.css" type="text/css">





  
  
  
  
  
  <link rel="stylesheet" href="css/print.css" type="text/css">





  
  
  
  
  
  <meta content="text/html; charset=gb2312" http-equiv="content-type">





  
  
  
  
  
  <title>Memento 模式</title>
</head>


<body>





<h3><a href="http://caterpillar.onlyfun.net/GossipCN/index.html">From
Gossip@caterpillar</a></h3>





<h1><a href="CppGossip.html">Design Pattern: Memento 模式</a></h1>

您希望您的程式中具有复原机制,如果您直接在物件中建立复原机制,这会使得物件本身的职责加重,并且使得物件的重用性降低。<br>
<br>
与其在物件内建立复原机制,不如将复原机制从物件中脱离出来,这个时候您可以使用Memento模式来达成这个功能。<br>
<br>
Memento模式在Originator中保留一个Memento成员,这个Memento可以包括Originator的成员资讯,在外部的话,
Memento可以由一个Caretaker维护,每对Originator作一个动作,Caretaker就保留Originator动作前的成员状
态,如果以后要复原物件状态,只要从Caretaker取回Memento物件,对Originator进行状态复原。<br>
<br>
Memento模式的 UML 类别结构图如下所示: <br>
<div style="text-align: center;"><img style="width: 526px; height: 150px;" alt="Memento" title="Memento" src="images/memento-1.jpg"><br>
<br>
<div style="text-align: left;">图中的Caretaker是用来保留原发者所创造的备忘录物件,以供日后复原时取回,state表示一个内部状态,内部状态多时,也可以将之组织为一个类别,Caretaker维护的Memento可以是多个,用来实现Redo与Undo多次的功能。<br>
<br>
下面提供一个简单的实作,看看如何实现Memento模式:<br>
<ul>
  <li> Originator.java
  </li>
</ul>

<pre>public class Originator { <br>    private String name; <br>    private String phone;<br><br>    public Originator(String name, String phone) { <br>        this.name = name; <br>        this.phone = phone; <br>    }<br><br>    // Some operations make state changed <br>    public void someOperation() { <br>        name = "noboby"; <br>        phone = "911-911"; <br>    } <br><br>    // recover object's state <br>    public void setMemento(Memento m) { <br>        this.name = m.getName(); <br>        this.phone = m.getPhone(); <br>    }<br><br>    public Memento createMemento() { <br>        return new Memento(name, phone); <br>    }<br><br>    public void showInfo() { <br>        System.out.println("Name: " + name + <br>                         "\nPhone: " + phone + "\n"); <br>    } <br>} <br></pre>

<br>

<ul>
  <li> Memento.java
  </li>
</ul>

<pre>public class Memento { <br>    private String name; <br>    private String phone;<br><br>    public Memento(String name, String phone) { <br>        this.name = name; <br>        this.phone = phone; <br>    }<br><br>    public String getName() { <br>        return name; <br>    }<br><br>    public String getPhone() { <br>        return phone; <br>    }<br><br>    public void setName(String name) { <br>        this.name = name; <br>    }<br><br>    public void setPhone(String phone) { <br>        this.phone = phone; <br>    } <br>}  <br></pre>

<br>

<ul>
  <li> Caretaker.java
  </li>
</ul>

<pre>public class Caretaker { <br>    private Memento memento;<br><br>    public void setMemento(Memento memento) { <br>        this.memento = memento; <br>    }<br><br>    public Memento getMemento() { <br>        return memento; <br>    }<br>} <br></pre>

\
<ul>
  <li> Main.java
  </li>
</ul>

<pre>public class Main { <br>    public static void main(String[] args) { <br>        Originator originator = <br>                      new Originator("Justin", "888-8888"); <br>        Caretaker caretaker = new Caretaker(); <br><br>        // save object's memento <br>        caretaker.setMemento(originator.createMemento()); <br><br>        originator.showInfo(); <br>        // some operations make the object's state changed <br>        originator.someOperation(); <br>        originator.showInfo(); <br><br>        // use memento to recover object's state <br>        originator.setMemento(caretaker.getMemento()); <br>        originator.showInfo(); <br>    } <br>} <br></pre>

<br>
可以结合 <a class="wikilink" href="CommandPattern.htm">Command 模式</a>
来实作Redo/Undo的功能,将操作前后的物件状态记录下来,并记录所使用的命令,当要实现Undo/Redo时,只要取回Memento物件以复原
物件状态即可。<br>
<br>
</div>
</div>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -