一况木、概述
不破壞封裝性的前提下乃坤,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài)弄贿,以便以后當(dāng)需要時(shí)能將該對(duì)象恢復(fù)到原先保存的狀態(tài)春锋。該模式又叫快照模式。
主要角色:
發(fā)起人角色:記錄當(dāng)前時(shí)刻的內(nèi)部狀態(tài)信息差凹,提供創(chuàng)建備忘錄和恢復(fù)備忘錄數(shù)據(jù)的功能期奔,實(shí)現(xiàn)其他業(yè)務(wù)功能,它可以訪問備忘錄里的所有信息危尿。
備忘錄角色:負(fù)責(zé)存儲(chǔ)發(fā)起人的內(nèi)部狀態(tài)呐萌,在需要的時(shí)候提供這些內(nèi)部狀態(tài)給發(fā)起人。
管理者角色:對(duì)備忘錄進(jìn)行管理谊娇,提供保存與獲取備忘錄的功能肺孤,但其不能對(duì)備忘錄的內(nèi)容進(jìn)行訪問與修改。
二济欢、代碼實(shí)現(xiàn)
舉例:有一個(gè)實(shí)體類赠堵,我修改了其中的某個(gè)值后,我后悔了法褥,我想要恢復(fù)成之前的狀態(tài)茫叭,此時(shí)我們通過備忘錄模式來實(shí)現(xiàn)。
發(fā)起人角色:實(shí)體類
public class DataBean {
private String data;
public DataBean(String data) {
this.data = data;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
//通過備忘錄保存
public Memento saveState(){
return new Memento(data);
}
//通過備忘錄恢復(fù)
public void recoverState(Memento memento){
this.data = memento.getData();
}
@Override
public String toString() {
return "DataBean{" +
"data='" + data + '\'' +
'}';
}
}
備忘錄角色:用以備份發(fā)起者
public class Memento {
//備忘錄中 持有和發(fā)起人一樣的數(shù)據(jù)
private String data;
public Memento(String data) {
this.data = data;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}
管理者角色:用以管理備忘錄
public class Caretaker {
//持有備忘錄
private Memento memento;
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
使用:
public static void main(String[] args) {
DataBean bean = new DataBean("我是原始數(shù)據(jù)");
System.out.println(bean.toString());
//創(chuàng)建管理者
Caretaker caretaker = new Caretaker();
//獲取備忘錄
Memento memento = bean.saveState();
//將備忘錄設(shè)置到管理者
caretaker.setMemento(memento);
//修改數(shù)據(jù)
bean.setData("我是修改之后的數(shù)據(jù)");
System.out.println(bean.toString());
//恢復(fù)數(shù)據(jù) 通過管理者獲得備忘錄
bean.recoverState(caretaker.getMemento());
System.out.println(bean.toString());
}
輸出:
DataBean{data='我是原始數(shù)據(jù)'}
DataBean{data='我是修改之后的數(shù)據(jù)'}
DataBean{data='我是原始數(shù)據(jù)'}
可以看到挖胃,我們創(chuàng)建實(shí)體類之后杂靶,通過備忘錄將實(shí)體類進(jìn)行了備份,然后通過備忘錄恢復(fù)了數(shù)據(jù)酱鸭,其中Caretaker管理者角色是用來管理備忘錄的。實(shí)際開發(fā)中這樣的例子有很多垛吗,比如五子棋悔棋凹髓,word撤銷等操作。
三怯屉、總結(jié)
優(yōu)點(diǎn):
- 提供了一種可以恢復(fù)狀態(tài)的機(jī)制蔚舀。當(dāng)用戶需要時(shí)能夠比較方便地將數(shù)據(jù)恢復(fù)到某個(gè)歷史的狀態(tài)。
- 實(shí)現(xiàn)了內(nèi)部狀態(tài)的封裝锨络。除了創(chuàng)建它的發(fā)起人之外赌躺,其他對(duì)象都不能夠訪問這些狀態(tài)信息。
- 簡(jiǎn)化了發(fā)起人類羡儿。發(fā)起人不需要管理和保存其內(nèi)部狀態(tài)的各個(gè)備份礼患,所有狀態(tài)信息都保存在備忘錄中,并由管理者進(jìn)行管理,這符合單一職責(zé)原則缅叠。
缺點(diǎn):
- 資源消耗較大悄泥,如果需要保存的內(nèi)部狀態(tài)過多或過去頻繁時(shí),會(huì)占用較大的內(nèi)存資源肤粱。
使用場(chǎng)景:
- 需要保存與恢復(fù)數(shù)據(jù)的場(chǎng)景弹囚,如玩游戲時(shí)的中間結(jié)果的存檔功能。
- 需要提供一個(gè)可回滾操作的場(chǎng)景领曼,如 Word鸥鹉、記事本、Photoshop庶骄,Eclipse 等軟件在編輯時(shí)按 Ctrl+Z 組合鍵毁渗,還有數(shù)據(jù)庫中事務(wù)操作。