设计模式读书笔记之备忘录模式(Memento)
来源:互联网 发布:人间正道是沧桑 知乎 编辑:程序博客网 时间:2024/05/17 02:12
备忘录模式:在不破坏封装性的前提下,捕获对象的内部状态并保存,这样以后就可以恢复该对象恢复到保存的状态。
备忘录模式比较简单, 不要因为名字比较陌生而不敢学它. 它没有复杂的结构, 上图已经能足够说明问题.
Originator: 备忘录发起人, 通常是需要备忘的对象自己.
Memento: 备忘录对象, 保存了Originator的内部状态.
CareTaker: 备忘录管理者.
基本代码:
- //备忘录发起人,即需要备忘的对象
- package designpattern.memento;
- public class Originator {
- private String state;
- public String getState() {
- return state;
- }
- public void setState(String state) {
- this.state = state;
- }
- public Memento createMemo(){
- return new Memento(state);
- }
- public void recover(Memento m){
- this.state = m.getState();
- }
- public void show(){
- System.out.println("state = " + state);
- }
- }
- //备忘录
- package designpattern.memento;
- public class Memento {
- private String state;
- public String getState() {
- return state;
- }
- public Memento(String state){
- this.state = state;
- }
- }
- //备忘录管理者
- package designpattern.memento;
- public class CareTaker {
- private Memento memento;
- public Memento getMemento() {
- return memento;
- }
- public void setMemento(Memento memento) {
- this.memento = memento;
- }
- }
- //test case
- package designpattern.memento;
- public class Test {
- public static void main(String[] args) {
- Originator o = new Originator();
- o.setState("On");
- o.show();
- CareTaker c = new CareTaker();
- c.setMemento(o.createMemo());
- o.setState("Off");
- o.show();
- o.recover(c.getMemento());
- o.show();
- }
- }
举例:
打rpg游戏的时候经常在打大boss之前把游戏保存一下,如果死了,就重新来。其实这就是备忘录模式。看代码:
- package designpattern.memento.game;
- public class GameRole {
- private int vitality;
- private int attack;
- private int defense;
- public GameRole(){
- this.vitality = 100;
- this.attack = 100;
- this.defense = 100;
- }
- public void showState(){
- System.out.println("vitality = " + vitality + "/nattack = " + attack + "/ndefence = " + defense);
- }
- public RoleStateMemo save(){
- return new RoleStateMemo(vitality, attack, defense);
- }
- public void recover(RoleStateMemo m){
- System.out.println("太菜了我,还好我存盘了,哈哈。");
- System.out.println("复活中......");
- this.vitality = m.getVitality();
- this.attack = m.getAttack();
- this.defense = m.getDefense();
- System.out.println("又复活了.");
- }
- public void fight(){
- System.out.println("与大Boss决战./n......");
- System.out.println("你输了, 你的生命,防御, 战斗力都将减为0.");
- this.vitality = 0;
- this.defense = 0;
- this.attack = 0;
- }
- }
- //
- package designpattern.memento.game;
- public class RoleStateMemo {
- private int vitality;
- private int attack;
- private int defense;
- public RoleStateMemo(int v, int a, int d){
- this.vitality = v;
- this.attack = a;
- this.defense = d;
- }
- public int getVitality() {
- return vitality;
- }
- public void setVitality(int vitality) {
- this.vitality = vitality;
- }
- public int getAttack() {
- return attack;
- }
- public void setAttack(int attack) {
- this.attack = attack;
- }
- public int getDefense() {
- return defense;
- }
- public void setDefense(int defense) {
- this.defense = defense;
- }
- }
- //
- package designpattern.memento.game;
- public class RoleMemoManager {
- private RoleStateMemo m;
- public RoleStateMemo getM() {
- return m;
- }
- public void setM(RoleStateMemo m) {
- this.m = m;
- }
- }
- //test case
- package designpattern.memento.game;
- public class Test {
- public static void main(String[] args) {
- GameRole role = new GameRole();
- role.showState();
- RoleMemoManager manager = new RoleMemoManager();
- manager.setM(role.save());
- role.fight();
- role.showState();
- role.recover(manager.getM());
- role.showState();
- }
- }
适用情景:
需要维护或记录历史的类。
0 0
- 设计模式读书笔记之备忘录模式(Memento)
- 设计模式读书笔记之备忘录模式(Memento)
- 设计模式之Memento(备忘录)
- 设计模式读书笔记:Memento(备忘录)
- 设计模式之备忘录模式Memento
- 设计模式之备忘录模式(Memento Pattern)
- java设计模式之备忘录模式Memento
- 设计模式之备忘录模式(Memento)
- 设计模式之备忘录模式,memento
- 设计模式之备忘录模式(Memento)
- 设计模式入门之备忘录模式Memento
- 设计模式之备忘录模式(Memento)摘录
- 23设计模式之备忘录模式(Memento)
- 23设计模式之备忘录模式(Memento)
- 设计模式之:备忘录模式(Memento)
- 设计模式之备忘录模式--- Pattern Memento
- 【设计模式】行为模式之备忘录Memento
- 设计模式之备忘录模式(Memento)
- 机房水题欢乐赛 2016-04-26 上午
- 如何实现拼音与汉字的互相转换
- 设计模式读书笔记之单例模式(Singleton)
- 【代码笔记】iOS-iCarouselDemo
- 单片机多任务调度
- 设计模式读书笔记之备忘录模式(Memento)
- hdu2522 A simple problem(循环节)
- ubuntu 14.04 samba安装 解决指定的网络名不再可用
- 问题解决:dialogfragment无法监听监听返回键
- c语言extern跟static可以一起用吗
- SSH 工具使用putty
- 设计模式读书笔记之状态模式(State Pattern)
- leetcode 202. Happy Number
- 浙江省赛e题Modulo Query