From 6d121af8d3ad62c1a370b70cc333548ccb56a960 Mon Sep 17 00:00:00 2001
From: CyC2018 <1029579233@qq.com>
Date: Tue, 5 Jun 2018 15:28:04 +0800
Subject: [PATCH] auto commit
---
notes/设计模式.md | 169 +++++++++++++++++-
pics/867e93eb-3161-4f39-b2d2-c0cd3788e194.png | Bin 0 -> 11264 bytes
2 files changed, 168 insertions(+), 1 deletion(-)
create mode 100644 pics/867e93eb-3161-4f39-b2d2-c0cd3788e194.png
diff --git a/notes/设计模式.md b/notes/设计模式.md
index 17505b60..35bddad5 100644
--- a/notes/设计模式.md
+++ b/notes/设计模式.md
@@ -1204,9 +1204,176 @@ doSprinkler()
在不违反封装的情况下获得对象的内部状态,从而在需要时可以将对象恢复到最初状态。
+### 类图
+
+- Originator:原始对象
+- Caretaker:负责保存好备忘录
+- Menento:备忘录,存储原始对象的的状态。备忘录实际上有两个接口,一个是提供给 Caretaker 的窄接口:它只能将备忘录传递给其它对象;一个是提供给 Originator 的宽接口,允许它访问到先前状态所需的所有数据。理想情况是只允许 Originator 访问本备忘录的内部状态。
+
+
+
+### 实现
+
+以下实现了一个简单计算器程序,可以输入两个值,然后计算这两个值的和。备忘录模式允许将这两个值存储起来,然后在某个时刻用存储的状态进行恢复。
+
+实现参考:[Memento Pattern - Calculator Example - Java Sourcecode](https://www.oodesign.com/memento-pattern-calculator-example-java-sourcecode.html)
+
+```java
+/**
+ * Originator Interface
+ */
+public interface Calculator {
+
+ // Create Memento
+ PreviousCalculationToCareTaker backupLastCalculation();
+
+ // setMemento
+ void restorePreviousCalculation(PreviousCalculationToCareTaker memento);
+
+ int getCalculationResult();
+
+ void setFirstNumber(int firstNumber);
+
+ void setSecondNumber(int secondNumber);
+}
+```
+
+```java
+/**
+ * Originator Implementation
+ */
+public class CalculatorImp implements Calculator {
+
+ private int firstNumber;
+ private int secondNumber;
+
+ @Override
+ public PreviousCalculationToCareTaker backupLastCalculation() {
+ // create a memento object used for restoring two numbers
+ return new PreviousCalculationImp(firstNumber, secondNumber);
+ }
+
+ @Override
+ public void restorePreviousCalculation(PreviousCalculationToCareTaker memento) {
+ this.firstNumber = ((PreviousCalculationToOriginator) memento).getFirstNumber();
+ this.secondNumber = ((PreviousCalculationToOriginator) memento).getSecondNumber();
+ }
+
+ @Override
+ public int getCalculationResult() {
+ // result is adding two numbers
+ return firstNumber + secondNumber;
+ }
+
+ @Override
+ public void setFirstNumber(int firstNumber) {
+ this.firstNumber = firstNumber;
+ }
+
+ @Override
+ public void setSecondNumber(int secondNumber) {
+ this.secondNumber = secondNumber;
+ }
+}
+```
+
+```java
+/**
+ * Memento Interface to Originator
+ *
+ * This interface allows the originator to restore its state
+ */
+public interface PreviousCalculationToOriginator {
+ int getFirstNumber();
+ int getSecondNumber();
+}
+```
+
+```java
+/**
+ * Memento interface to CalculatorOperator (Caretaker)
+ */
+public interface PreviousCalculationToCareTaker {
+ // no operations permitted for the caretaker
+}
+```
+
+```java
+/**
+ * Memento Object Implementation
+ *
+ * Note that this object implements both interfaces to Originator and CareTaker
+ */
+public class PreviousCalculationImp implements PreviousCalculationToCareTaker,
+ PreviousCalculationToOriginator {
+
+ private int firstNumber;
+ private int secondNumber;
+
+ public PreviousCalculationImp(int firstNumber, int secondNumber) {
+ this.firstNumber = firstNumber;
+ this.secondNumber = secondNumber;
+ }
+
+ @Override
+ public int getFirstNumber() {
+ return firstNumber;
+ }
+
+ @Override
+ public int getSecondNumber() {
+ return secondNumber;
+ }
+}
+```
+
+```java
+/**
+ * CareTaker object
+ */
+public class Client {
+
+ public static void main(String[] args) {
+ // program starts
+ Calculator calculator = new CalculatorImp();
+
+ // assume user enters two numbers
+ calculator.setFirstNumber(10);
+ calculator.setSecondNumber(100);
+
+ // find result
+ System.out.println(calculator.getCalculationResult());
+
+ // Store result of this calculation in case of error
+ PreviousCalculationToCareTaker memento = calculator.backupLastCalculation();
+
+ // user enters a number
+ calculator.setFirstNumber(17);
+
+ // user enters a wrong second number and calculates result
+ calculator.setSecondNumber(-290);
+
+ // calculate result
+ System.out.println(calculator.getCalculationResult());
+
+ // user hits CTRL + Z to undo last operation and see last result
+ calculator.restorePreviousCalculation(memento);
+
+ // result restored
+ System.out.println(calculator.getCalculationResult());
+ }
+}
+```
+
+```html
+110
+-273
+110
+```
+
### JDK
-- [java.util.Date](http://docs.oracle.com/javase/8/docs/api/java/util/Date.html)
+- java.io.Serializable
## 7. 观察者(Observer)
diff --git a/pics/867e93eb-3161-4f39-b2d2-c0cd3788e194.png b/pics/867e93eb-3161-4f39-b2d2-c0cd3788e194.png
new file mode 100644
index 0000000000000000000000000000000000000000..26cb0153f21019cadba1a74ad6b78e3cb03a177b
GIT binary patch
literal 11264
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
v{a^P{5{v);jgkM|O`!;HcM$hrXG
literal 0
HcmV?d00001