樂山網(wǎng)站建設(shè)公司什么是seo?
文章目錄
- 一.什么是備忘錄設(shè)計(jì)模式?
- 二.備忘錄模式的特點(diǎn)
- 三.備忘錄模式的結(jié)構(gòu)
- 四.備忘錄模式的優(yōu)缺點(diǎn)
- 五.備忘錄模式的 C++ 實(shí)現(xiàn)
- 六.備忘錄模式的 Java 實(shí)現(xiàn)
- 七.總結(jié)
類圖: 備忘錄設(shè)計(jì)模式類圖
一.什么是備忘錄設(shè)計(jì)模式?
?備忘錄設(shè)計(jì)模式(Memento Pattern)是一種行為型設(shè)計(jì)模式,用于在不暴露對象實(shí)現(xiàn)細(xì)節(jié)的前提下,捕獲并保存對象在某一時刻的狀態(tài),以便之后可以將其恢復(fù)到之前的狀態(tài)。該模式的主要目標(biāo)是保存對象的狀態(tài)并在需要時進(jìn)行狀態(tài)回滾。
二.備忘錄模式的特點(diǎn)
- 封裝狀態(tài):將對象的內(nèi)部狀態(tài)存儲在備忘錄中,并且不讓外部訪問這些狀態(tài)細(xì)節(jié)。
- 提供撤銷功能:支持撤銷操作,特別適合需要恢復(fù)到之前狀態(tài)的場景。
- 降低耦合:發(fā)起者(Originator)與管理備忘錄的角色(Caretaker)解耦。
三.備忘錄模式的結(jié)構(gòu)
- Originator(發(fā)起者):負(fù)責(zé)創(chuàng)建備忘錄并恢復(fù)自身狀態(tài)。
- Memento(備忘錄):存儲發(fā)起者的狀態(tài)。
- Caretaker(管理者):負(fù)責(zé)保存和恢復(fù)備忘錄。
四.備忘錄模式的優(yōu)缺點(diǎn)
- 優(yōu)點(diǎn):
- 提供了一種狀態(tài)恢復(fù)機(jī)制。
- 發(fā)起者的內(nèi)部狀態(tài)對外部透明。
- 缺點(diǎn):
- 可能需要大量的存儲空間,尤其是需要存儲大量狀態(tài)時。
- 如果對象狀態(tài)過于復(fù)雜,可能會增加備忘錄的維護(hù)成本。
五.備忘錄模式的 C++ 實(shí)現(xiàn)
#include <iostream>
#include <string>
#include <vector>
using namespace std;// 備忘錄類
class Memento {
private:string state;
public:Memento(const string& s) : state(s) {}string GetState() const { return state; }
};// 發(fā)起者類
class Originator {
private:string state;
public:void SetState(const string& s) {state = s;cout << "Set state to: " << state << endl;}string GetState() const { return state; }Memento* CreateMemento() const {return new Memento(state);}void SetMemento(Memento* memento) {state = memento->GetState();cout << "Restored state to: " << state << endl;}
};// 管理者類
class Caretaker {
private:vector<Memento*> mementos;
public:void SaveMemento(Memento* memento) {mementos.push_back(memento);}Memento* GetMemento(int index) const {if (index >= 0 && index < mementos.size()) {return mementos[index];}return nullptr;}~Caretaker() {for (Memento* m : mementos) {delete m;}}
};int main() {Originator originator;Caretaker caretaker;originator.SetState("State1");caretaker.SaveMemento(originator.CreateMemento());originator.SetState("State2");caretaker.SaveMemento(originator.CreateMemento());originator.SetState("State3");// 恢復(fù)到之前的狀態(tài)originator.SetMemento(caretaker.GetMemento(0));originator.SetMemento(caretaker.GetMemento(1));return 0;
}
六.備忘錄模式的 Java 實(shí)現(xiàn)
import java.util.ArrayList;
import java.util.List;// 備忘錄類
class Memento {private String state;public Memento(String state) {this.state = state;}public String getState() {return state;}
}// 發(fā)起者類
class Originator {private String state;public void setState(String state) {this.state = state;System.out.println("Set state to: " + state);}public String getState() {return state;}public Memento createMemento() {return new Memento(state);}public void setMemento(Memento memento) {this.state = memento.getState();System.out.println("Restored state to: " + state);}
}// 管理者類
class Caretaker {private List<Memento> mementos = new ArrayList<>();public void saveMemento(Memento memento) {mementos.add(memento);}public Memento getMemento(int index) {if (index >= 0 && index < mementos.size()) {return mementos.get(index);}return null;}
}public class MementoPatternDemo {public static void main(String[] args) {Originator originator = new Originator();Caretaker caretaker = new Caretaker();originator.setState("State1");caretaker.saveMemento(originator.createMemento());originator.setState("State2");caretaker.saveMemento(originator.createMemento());originator.setState("State3");// 恢復(fù)到之前的狀態(tài)originator.setMemento(caretaker.getMemento(0));originator.setMemento(caretaker.getMemento(1));}
}
七.總結(jié)
?備忘錄設(shè)計(jì)模式適用于需要保存對象狀態(tài)并提供恢復(fù)功能的場景,比如文本編輯器、游戲存檔等。通過將狀態(tài)封裝到備忘錄中,備忘錄模式實(shí)現(xiàn)了狀態(tài)的透明保存與恢復(fù),從而提升了系統(tǒng)的可維護(hù)性和靈活性。
應(yīng)用場景:
- 文本編輯器:保存編輯狀態(tài),支持撤銷和恢復(fù)操作。
- 游戲存檔:保存玩家的游戲進(jìn)度,并允許玩家恢復(fù)到之前的狀態(tài)。
- 事務(wù)管理:數(shù)據(jù)庫事務(wù)可以利用備忘錄模式保存數(shù)據(jù)狀態(tài),實(shí)現(xiàn)事務(wù)回滾。