zoukankan      html  css  js  c++  java
  • java设计模式之备忘录模式

    备忘录模式

      备忘录模式是一种软件设计模式:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。一听到备忘录这个字的时候想起了小小时打的游戏,每次遇到大boss的时候都会保存一下进度,打过了就不需要恢复记录,打不过肯定就复原到刚刚保存的记录咯,重新打一遍BOSS,打死为止。哈哈,这就是备忘录模式,虽然很多模式都只是学到基础,但是发现越来越接近生活了。

    涉及角色:
      Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态。Originator可以根据需要决定Memento存储自己的哪些内部状态。
      Memento(备忘录):负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问备忘录。备忘录有两个接口:Caretaker只能看到备忘录的窄接口,他只能将备忘录传递给其他对象。Originator却可看到备忘录的宽接口,允许它访问返回到先前状态所需要的所有数据。
      Caretaker(管理者):负责备忘录Memento,不能对Memento的内容进行访问或者操作。

    备忘录模式UML图

     

    备忘录模式代码

    package com.roc.meomory;
    /**
     * 游戏角色
     * @author liaowp
     *
     */
    public class GameRole {
        private int vit;
        private int atk;
    
        public void init(){
            vit=100;
            atk=100;
        }
        
        public void show(){
            System.out.println("体力:"+vit);
            System.out.println("攻击力:"+atk);
        }
        
        public void fightBoss(){
            this.vit=0;
            this.atk=0;
        }
        
        public RoleStateMemento saveMemento(){
            return (new RoleStateMemento(vit, atk));
        }
        
        public void recove(RoleStateMemento roleStateMemento){
            this.vit=roleStateMemento.getVit();
            this.atk=roleStateMemento.getAtk();
        }
    }
    package com.roc.meomory;
    /**
     * 游戏角色管理类
     * @author liaowp
     *
     */
    public class RoleStateMange {
        
        private RoleStateMemento memento;
    
        public RoleStateMemento getMemento() {
            return memento;
        }
    
        public void setMemento(RoleStateMemento memento) {
            this.memento = memento;
        }
        
    }
    package com.roc.meomory;
    /**
     * 存储类
     * @author liaowp
     *
     */
    public class RoleStateMemento {
            
        private int vit;
        private int atk;
        
        public RoleStateMemento(int vit, int atk){
            this.vit=vit;
            this.atk=atk;
        }
    
        public int getVit() {
            return vit;
        }
    
        public void setVit(int vit) {
            this.vit = vit;
        }
    
        public int getAtk() {
            return atk;
        }
    
        public void setAtk(int atk) {
            this.atk = atk;
        }
    }
    package com.roc.meomory;
    /**
     * 备忘录模式
     * @author liaowp
     *
     */
    public class Client {
        public static void main(String[] args) {
            GameRole liaowp=new GameRole();
            liaowp.init();
            liaowp.show();
            RoleStateMange adminMange=new RoleStateMange();
            adminMange.setMemento(liaowp.saveMemento());//保存
            liaowp.fightBoss();
            liaowp.show();
            liaowp.recove(adminMange.getMemento());
            liaowp.show();
            
        }
    }

    备忘录模式适用场景

      适合功能比较复杂的,但需要维护或记录属性历史的功能。

  • 相关阅读:
    【专题总结】数学(未完)
    如何使用SOCKS代理通过aiohttp发出请求?(How to use SOCKS proxies to make requests with aiohttp?)
    通过 alembic 重命名表列名(Model字段名)
    Supervisor使用详解
    MySQL创建数据库并设置字符集
    手动配置代理,让终端上网
    mac下镜像飞速安装Homebrew教程
    Python3.8 异步 asyncio
    PHP版本微信支付开发
    PHP对接支付宝支付接口
  • 原文地址:https://www.cnblogs.com/liaoweipeng/p/5791064.html
Copyright © 2011-2022 走看看