码迷,mamicode.com
首页 > 编程语言 > 详细

java 之 备忘录模式(大话设计模式)

时间:2017-12-12 13:44:34      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:信息   分享图片   角色   模式   return   pre   ack   body   save   

备忘录模式,给笔者的感觉,我们在实际开发中很少用到,至少笔者是没用到过。一般在游戏后台开发应该会经常用到吧!当然这只是

笔者的推断。先看下类图

大话设计模式-类图

技术分享图片

再继续看下Demo吧

/**
 * 需要保存的进度信息类
 */
public class RoleSateMemento{

    private Integer atk;

    private Integer vit;

    private Integer attack;

    public RoleSateMemento(Integer atk, Integer vit, Integer attack) {
        super();
        this.atk = atk;
        this.vit = vit;
        this.attack = attack;
    }

    public Integer getAtk() {
        return atk;
    }

    public void setAtk(Integer atk) {
        this.atk = atk;
    }

    public Integer getVit() {
        return vit;
    }

    public void setVit(Integer vit) {
        this.vit = vit;
    }

    public Integer getAttack() {
        return attack;
    }

    public void setAttack(Integer attack) {
        this.attack = attack;
    }
}
/**
 * 存储进度类
 */
public class RolerStateCaretaker {

    private RoleSateMemento roleSateMemento;

    public RoleSateMemento getRoleSateMemento() {
        return roleSateMemento;
    }

    public void setRoleSateMemento(RoleSateMemento roleSateMemento) {
        this.roleSateMemento = roleSateMemento;
    }
}
/**
 * 角色类
 */
public class RolerInfo {

    private Integer atk;

    private Integer vit;

    private Integer attack;

    public RolerInfo(Integer atk, Integer vit, Integer attack) {
        super();
        this.atk = atk;
        this.vit = vit;
        this.attack = attack;
    }

    public static RolerInfo initRoler() {
        return new RolerInfo(100, 100, 100);
    }

    public void showState() {
        System.out.println("当前血量: " + vit);
        System.out.println("当前攻击力: " + atk);
        System.out.println("当前防御力: " + attack);
    }

    public RoleSateMemento saveRolerInfo() {
        return new RoleSateMemento(atk, vit, attack);
    }

    public void restoreMenmento(RoleSateMemento roleSateMemento) {
        this.vit = roleSateMemento.getVit();
        this.atk = roleSateMemento.getAtk();
        this.attack = roleSateMemento.getAttack();
    }

    public Integer getAtk() {
        return atk;
    }


    public void setAtk(Integer atk) {
        this.atk = atk;
    }


    public Integer getVit() {
        return vit;
    }


    public void setVit(Integer vit) {
        this.vit = vit;
    }


    public Integer getAttack() {
        return attack;
    }


    public void setAttack(Integer attack) {
        this.attack = attack;
    }
}
/**
 * 客户端
 */
public class Test {

    public static void main(String[] args) {
        RolerInfo role = RolerInfo.initRoler();
        System.out.println("----------大战BOSS之前----------");
        role.showState();

        //保持进度
        RolerStateCaretaker caretaker = new RolerStateCaretaker();
        caretaker.setRoleSateMemento(role.saveRolerInfo());

        //大战BOSS
        role.setAtk(0);
        role.setAttack(0);
        role.setVit(0);
        System.out.println("----------大战BOSS----------");
        role.showState();

        //恢复存档
        role.restoreMenmento(caretaker.getRoleSateMemento());
        System.out.println("----------恢复----------");
        role.showState();

    }
}

 

运行结果

----------大战BOSS之前----------
当前血量: 100
当前攻击力: 100
当前防御力: 100
----------大战BOSS----------
当前血量: 0
当前攻击力: 0
当前防御力: 0
----------恢复----------
当前血量: 100
当前攻击力: 100
当前防御力: 100

 

简单看下记忆类和负责保存记忆的类,其实就是几个属性,然后还有set,get方法,并不复杂,主要的逻辑还是在角色类里。笔者之前看大话设计模式时

一直误解为什么角色类里面的属性和记忆类里面的属性相同,而不让角色类继承记忆类呢? 后来仔细想下,原因是,角色里面有很多属性不需要保存。打个比方

角色的性别不会因为大战BOSS之后就变性,所以性别并不需要保存,所以这里没有用继承,记忆只是负责保存需要保存的属性。

以上是笔者对备忘录模式的理解,希望能帮助学习的小伙伴。另外笔者强烈推荐学习的小伙伴多看看大话设计模式,然后领悟其精髓,自己在手动写一次代码。

java 之 备忘录模式(大话设计模式)

标签:信息   分享图片   角色   模式   return   pre   ack   body   save   

原文地址:http://www.cnblogs.com/zhuxiansheng/p/8027025.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!