本文主要是介绍设计模式 -- 备忘录模式(Memento Pattern),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。
应用场景
-
需要保存某个对象在某一时刻的状态。
-
外界想访问对象的状态,但是又不想直接暴露接口给外部,这时候可以将对象状态保存下来,间接的暴露给外部。
-
当你正在开发一个功能,这个功能需要存档的时候就应该想到它。例如游戏,文档编辑器等等,都需要在你下次重新打开的时候恢复到你关闭它时候的状态。
// 定义游戏Originator
public class GameOriginator {private int currentScore;//将需要保存的状态分装在Memento里对外提供public GameProgressMemento saveProcess() {return new GameProgressMemento(currentScore);}//通过从外部接收的Memento恢复状态public void restoreProcess(GameProgressMemento memento) {currentScore = memento.getScore();}//对内部状态的使用public void playGame() {System.out.println("------------------开始游戏------------------");System.out.println("当前分数为:"+ currentScore);System.out.println("杀死一个小怪物得1分");currentScore++;System.out.println(String.format("总分为:%d", currentScore));}public void exitGame(){System.out.println("退出游戏");currentScore=0;System.out.println("-----------------退出游戏-------------------");}
}// 构建备忘录Memento
public class GameProgressMemento {private int score;public GameProgressMemento(int score) {this.score = score;}public int getScore() {return score;}
}// 构建CareTaker
public class GameCareTaker {private List<GameProgressMemento> memento= new ArrayList<>();public void saveMemento(GameProgressMemento memento) {this.memento.add(memento);}public GameProgressMemento getMemento(int index) {return this.memento.get(index);}
}// 客户端使用
public class MementoClient {public void replayGame() {GameOriginator originator = new GameOriginator();GameCareTaker careTaker = new GameCareTaker();//玩游戏originator.playGame();//保存进度careTaker.saveMemento(originator.saveProcess());//退出游戏originator.exitGame();//重新打开游戏,恢复进度originator.restoreProcess(careTaker.getMemento(0));originator.playGame();}
}// 输出结果
------------------开始游戏------------------
当前分数为:0
杀死一个小怪物得1分
总分为:1
退出游戏
-----------------退出游戏-------------------
------------------开始游戏------------------
当前分数为:1
杀死一个小怪物得1分
总分为:2
备忘录模式同原型模式混合使用。在备忘录模式中,通过定义“备忘录”来备份“发起人”的信息,而原型模式的 clone() 方法具有自备份功能,所以,如果让发起人实现 Cloneable 接口就有备份自己的功能,这时可以删除备忘录类。
class OriginatorPrototype implements Cloneable {private String state;public String getState() {return state;}public OriginatorPrototype createMemento() {return this.clone();}public void restoreMemento(OriginatorPrototype opt) {this.setState(opt.getState());}
}
根据以下文章总结:
-
Java设计模式:23种设计模式全面解析(超级详细)HYPERLINK http://c.biancheng.net/design_pattern/
-
3种设计模式详解 https://www.iteye.com/blog/zz563143188-1847029
-
Android系统编程思想:设计模式https://github.com/sucese/android-open-source-project-analysis/blob/master/doc/Android%E7%B3%BB%E7%BB%9F%E8%BD%AF%E4%BB%B6%E8%AE%BE%E8%AE%A1%E7%AF%87/02Android%E7%B3%BB%E7%BB%9F%E8%BD%AF%E4%BB%B6%E8%AE%BE%E8%AE%A1%E7%AF%87%EF%BC%9A%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F.md#35-%E8%A7%82%E5%AF%9F%E8%80%85%E6%A8%A1%E5%BC%8F
-
设计模式 https://blog.csdn.net/shusheng0007/category_8638565.html
-
java设计模式 https://blog.csdn.net/qq_37909508/category_8976362.html
-
设计模式 https://www.cnblogs.com/zuoxiaolong/category/509144.html
-
设计模式 在源码中的应用 https://blog.csdn.net/qq_36970993/category_10620886.html
-
Android系统设计中存在设计模式分析 https://www.2cto.com/kf/201208/150650.html
-
Android设计模式系列 - 基于android的各种代码分析各种设计模式 https://www.cnblogs.com/qianxudetianxia/category/312863.html
这篇关于设计模式 -- 备忘录模式(Memento Pattern)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!