《一天聊一个设计模式》备忘录
生活随笔
收集整理的這篇文章主要介紹了
《一天聊一个设计模式》备忘录
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
備忘錄(Memento)
Intent
在不違反封裝的情況下獲得對象的內(nèi)部狀態(tài),從而在需要時可以將對象恢復(fù)到最初狀態(tài)。
Class Diagram
- Originator:原始對象
- Caretaker:負責(zé)保存好備忘錄
- Memento:備忘錄,存儲原始對象的的狀態(tài)。備忘錄實際上有兩個接口,一個是提供給 Caretaker 的窄接口:它只能將備忘錄傳遞給其它對象;一個是提供給 Originator 的寬接口,允許它訪問到先前狀態(tài)所需的所有數(shù)據(jù)。理想情況是只允許 Originator 訪問本備忘錄的內(nèi)部狀態(tài)。
Implementation
以下實現(xiàn)了一個簡單計算器程序,可以輸入兩個值,然后計算這兩個值的和。備忘錄模式允許將這兩個值存儲起來,然后在某個時刻用存儲的狀態(tài)進行恢復(fù)。
實現(xiàn)參考:Memento Pattern - Calculator Example - Java Sourcecode
/*** Originator Interface*/ public interface Calculator {// Create MementoPreviousCalculationToCareTaker backupLastCalculation();// setMementovoid restorePreviousCalculation(PreviousCalculationToCareTaker memento);int getCalculationResult();void setFirstNumber(int firstNumber);void setSecondNumber(int secondNumber); } /*** Originator Implementation*/ public class CalculatorImp implements Calculator {private int firstNumber;private int secondNumber;@Overridepublic PreviousCalculationToCareTaker backupLastCalculation() {// create a memento object used for restoring two numbersreturn new PreviousCalculationImp(firstNumber, secondNumber);}@Overridepublic void restorePreviousCalculation(PreviousCalculationToCareTaker memento) {this.firstNumber = ((PreviousCalculationToOriginator) memento).getFirstNumber();this.secondNumber = ((PreviousCalculationToOriginator) memento).getSecondNumber();}@Overridepublic int getCalculationResult() {// result is adding two numbersreturn firstNumber + secondNumber;}@Overridepublic void setFirstNumber(int firstNumber) {this.firstNumber = firstNumber;}@Overridepublic void setSecondNumber(int secondNumber) {this.secondNumber = secondNumber;} } /*** Memento Interface to Originator** This interface allows the originator to restore its state*/ public interface PreviousCalculationToOriginator {int getFirstNumber();int getSecondNumber(); } /*** Memento interface to CalculatorOperator (Caretaker)*/ public interface PreviousCalculationToCareTaker {// no operations permitted for the caretaker } /*** 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;}@Overridepublic int getFirstNumber() {return firstNumber;}@Overridepublic int getSecondNumber() {return secondNumber;} } /*** CareTaker object*/ public class Client {public static void main(String[] args) {// program startsCalculator calculator = new CalculatorImp();// assume user enters two numberscalculator.setFirstNumber(10);calculator.setSecondNumber(100);// find resultSystem.out.println(calculator.getCalculationResult());// Store result of this calculation in case of errorPreviousCalculationToCareTaker memento = calculator.backupLastCalculation();// user enters a numbercalculator.setFirstNumber(17);// user enters a wrong second number and calculates resultcalculator.setSecondNumber(-290);// calculate resultSystem.out.println(calculator.getCalculationResult());// user hits CTRL + Z to undo last operation and see last resultcalculator.restorePreviousCalculation(memento);// result restoredSystem.out.println(calculator.getCalculationResult());} } 110 -273 110JDK
- java.io.Serializable
總結(jié)
以上是生活随笔為你收集整理的《一天聊一个设计模式》备忘录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信用卡催收爆通讯录是不是属于违法?必要时
- 下一篇: 京东金条可以协商延期还款吗,可以