auto commit
This commit is contained in:
parent
9000ddedb0
commit
6d121af8d3
169
notes/设计模式.md
169
notes/设计模式.md
|
@ -1204,9 +1204,176 @@ doSprinkler()
|
||||||
|
|
||||||
在不违反封装的情况下获得对象的内部状态,从而在需要时可以将对象恢复到最初状态。
|
在不违反封装的情况下获得对象的内部状态,从而在需要时可以将对象恢复到最初状态。
|
||||||
|
|
||||||
|
### 类图
|
||||||
|
|
||||||
|
- Originator:原始对象
|
||||||
|
- Caretaker:负责保存好备忘录
|
||||||
|
- Menento:备忘录,存储原始对象的的状态。备忘录实际上有两个接口,一个是提供给 Caretaker 的窄接口:它只能将备忘录传递给其它对象;一个是提供给 Originator 的宽接口,允许它访问到先前状态所需的所有数据。理想情况是只允许 Originator 访问本备忘录的内部状态。
|
||||||
|
|
||||||
|
<div align="center"> <img src="../pics//867e93eb-3161-4f39-b2d2-c0cd3788e194.png"/> </div><br>
|
||||||
|
|
||||||
|
### 实现
|
||||||
|
|
||||||
|
以下实现了一个简单计算器程序,可以输入两个值,然后计算这两个值的和。备忘录模式允许将这两个值存储起来,然后在某个时刻用存储的状态进行恢复。
|
||||||
|
|
||||||
|
实现参考:[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
|
||||||
|
* <p>
|
||||||
|
* 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
|
### JDK
|
||||||
|
|
||||||
- [java.util.Date](http://docs.oracle.com/javase/8/docs/api/java/util/Date.html)
|
- java.io.Serializable
|
||||||
|
|
||||||
## 7. 观察者(Observer)
|
## 7. 观察者(Observer)
|
||||||
|
|
||||||
|
|
BIN
pics/867e93eb-3161-4f39-b2d2-c0cd3788e194.png
Normal file
BIN
pics/867e93eb-3161-4f39-b2d2-c0cd3788e194.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 11 KiB |
Loading…
Reference in New Issue
Block a user