學(xué)網(wǎng)站開發(fā)培訓(xùn)機(jī)構(gòu)今日新聞聯(lián)播主要內(nèi)容
設(shè)計(jì)模式—行為型模式之備忘錄模式
備忘錄(Memento)模式:在不破壞封裝性的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài),以便以后當(dāng)需要時(shí)能將該對(duì)象恢復(fù)到原先保存的狀態(tài)。該模式又叫快照模式。這是一種對(duì)象行為型模式。
有如下角色:
-
發(fā)起人(Originator)角色:記錄當(dāng)前時(shí)刻的內(nèi)部狀態(tài)信息,提供創(chuàng)建備忘錄和恢復(fù)備忘錄數(shù)據(jù)的功能,實(shí)現(xiàn)其他業(yè)務(wù)功能,它可以訪問備忘錄里的所有信息。
-
備忘錄(Memento)角色:負(fù)責(zé)存儲(chǔ)發(fā)起人的內(nèi)部狀態(tài),在需要的時(shí)候提供這些內(nèi)部狀態(tài)給發(fā)起人。
-
管理者(Caretaker)角色:對(duì)備忘錄進(jìn)行管理,提供保存與獲取備忘錄的功能,但其不能對(duì)備忘錄的內(nèi)容進(jìn)行訪問與修改。
示例
比如我們有一個(gè)奧特曼游戲,每一個(gè)奧特曼有血量,等級(jí),我們可以建一個(gè)游戲備份來保存這些有用的內(nèi)容,并使用游戲服務(wù)器管理他們。
奧特曼類如下:
@Data
public class Ultraman {private Integer hp;//血量private Integer level;//等級(jí)//備忘錄管理者private GameServer gameServer = new GameServer();/*** 進(jìn)行游戲*/public void play(){hp = level = new Random().nextInt();}/*** 保存?zhèn)渫?/public void saveRocord() throws Exception {System.out.println("保存?zhèn)渫?#34;);gameServer.addRecord(this);}/*** 獲取備忘錄*/public Ultraman restoreRecord(Integer id) throws Exception {System.out.println("獲取記錄");return gameServer.getRecord(id);}public void exit() throws Exception {System.out.println("退出并存檔");gameServer.addRecord(this);}
}
記錄類如下:
/*** 游戲備份----備忘錄*/
@Data
public class GameRocord {private Integer id;//備忘錄idprivate Integer hp;//血量private Integer level;//等級(jí)
}
游戲服務(wù)器類如下:
/*** 游戲服務(wù)器——備忘錄管理者*/
public class GameServer {//記錄idprivate Integer i = 1;//備忘錄管理private Map<Integer,GameRocord> recordMap = new HashMap<>();/*** 添加備忘錄*/public void addRecord(Ultraman ultraman) throws Exception {GameRocord gameRocord = new GameRocord();BeanUtils.copyProperties(gameRocord,ultraman);gameRocord.setId(i++);recordMap.put(gameRocord.getId(),gameRocord);}/*** 恢復(fù)備忘錄*/public Ultraman getRecord(Integer id) throws Exception{GameRocord gameRocord = recordMap.get(id);Ultraman ultraman = new Ultraman();BeanUtils.copyProperties(ultraman,gameRocord);return ultraman;}}
測試類如下:
public class MementoTest {public static void main(String[] args) throws Exception {Ultraman ultraman = new Ultraman();//進(jìn)行游戲ultraman.play();//存檔ultraman.saveRocord();ultraman.setHp(1);ultraman.saveRocord();Ultraman ultramanRecord = ultraman.restoreRecord(1);ultraman.exit();}
}
運(yùn)行截圖如下: