备忘录模式实例象棋中“悔棋”操作

简介: 备忘录模式实例象棋中“悔棋”操作

1.题目分析
首先需要一个实体类来代表一枚象棋的基本信息,包含象棋的名字/当前坐标
其次需要一个备忘录类来保存象棋的信息,这个类应当含有象棋类的要保存的字段,并且该类对外封闭
由于备忘录类是对外封闭的,所以应当由一个备忘录管理者类,来负责创建和恢复象棋的备忘录
客户端不与备忘录类耦合,而是借用备忘录管理类来管理备忘录
2.UML图
在这里插入图片描述
3.代码
象棋实体类

package 备忘录模式;

public class Chessman {
    private String name;
    private int x;
    private int y;
    public ChessmanMemento CreateMemento() {
        return new ChessmanMemento(name, x, y);
    }
    public void setMemento(ChessmanMemento chessmanMemento) {
        this.name = chessmanMemento.getName();
        this.x = chessmanMemento.getX();
        this.y = chessmanMemento.getY();
    }
    public Chessman() {
    }

    public Chessman(String name, int x, int y) {
        this.name = name;
        this.x = x;
        this.y = y;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }
    public String toString() {
        return "Chessman{" +
                "name='" + name + '\'' +
                ", x=" + x +
                ", y=" + y +
                '}';
    }
}

象棋备忘录 用于保存象棋的状态信息

package 备忘录模式;

public class ChessmanMemento {
    private String name;
    private int x;
    private int y;

    public ChessmanMemento(String name, int x, int y) {
        this.name = name;
        this.x = x;
        this.y = y;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }
    
}

备忘录负责人 管理备忘录 隐藏备忘录内部实现

package 备忘录模式;

public class MementoCaretaker {
        private ChessmanMemento chessmanMemento;

        public ChessmanMemento getChessmanMemento() {
            return chessmanMemento;
        }

        public void setChessmanMemento(ChessmanMemento chessmanMemento) {
            this.chessmanMemento = chessmanMemento;
        }
}

象棋悔棋备忘录测试类

package 备忘录模式;

public class Test {

    public static void main(String[] args) {
        
        Chessman chessman = new Chessman("马", 1, 1);
        System.out.println("象棋初始状态-->" + chessman);
        MementoCaretaker mementoCaretaker = new MementoCaretaker();
        mementoCaretaker.setChessmanMemento(chessman.CreateMemento());
        chessman.setX(666);
        chessman.setY(666);
        System.out.println("象棋修改状态-->" + chessman);
        chessman.setMemento(mementoCaretaker.getChessmanMemento());
        System.out.println("象棋恢复状态-->" + chessman);

    }
}

运行结果
在这里插入图片描述
4.总结:

  1. 该模式的优缺点,特别从开闭原则论述

优点:利用备忘录管理者类,保持了象棋的封闭性,没有破坏其封装。保存了象棋的内部状态,以便在需要的时候恢复状态
缺点:如果类的信息太多,会十分消耗资源

  1. 编程中遇到的问题及解决方法:

该模式在不同的场景下有改进的几个方面,比如:备忘录管理者类,其字段备忘录可以改为一个Map类型的,key为唯一的字段属性,value为保存的备忘录对象,这样就可以根据Key来恢复任意一个状态,Github的版本控制就是这个原理,每一个版本都有对应的一个哈希串,可以回退到任意一个版本。
可以结合原型模式+备忘录来处理相应的需求,以减少资源的消耗

目录
相关文章
|
7月前
|
设计模式 Java
Java设计模式【二十二】:空对象模式
Java设计模式【二十二】:空对象模式
59 0
|
4月前
|
设计模式
学会了这个设计模式,再也不是只会写if/else了
本文详细介绍了责任链设计模式(Chain of Responsibility Pattern),这是一种行为型设计模式,用于创建一个接收者对象的链,通过解耦请求的发送者和接收者,允许沿着链传递请求,直到某个接收者能够处理它。
学会了这个设计模式,再也不是只会写if/else了
|
4月前
|
设计模式 缓存 算法
揭秘策略模式:如何用Java设计模式轻松切换算法?
【8月更文挑战第30天】设计模式是解决软件开发中特定问题的可重用方案。其中,策略模式是一种常用的行为型模式,允许在运行时选择算法行为。它通过定义一系列可互换的算法来封装具体的实现,使算法的变化与客户端分离。例如,在电商系统中,可以通过定义 `DiscountStrategy` 接口和多种折扣策略类(如 `FidelityDiscount`、`BulkDiscount` 和 `NoDiscount`),在运行时动态切换不同的折扣逻辑。这样,`ShoppingCart` 类无需关心具体折扣计算细节,只需设置不同的策略即可实现灵活的价格计算,符合开闭原则并提高代码的可维护性和扩展性。
68 2
|
6月前
|
设计模式
备忘录模式-大话设计模式
备忘录模式-大话设计模式
|
7月前
|
设计模式 Java 开发者
Java设计模式【二十一】:状态模式
Java设计模式【二十一】:状态模式
55 0
|
7月前
|
设计模式
二十三种设计模式全面解析-当你的对象需要知道其他对象的状态变化时,观察者模式是你的救星!
二十三种设计模式全面解析-当你的对象需要知道其他对象的状态变化时,观察者模式是你的救星!
|
7月前
|
设计模式 存储
二十三种设计模式全面解析-深入探究备忘录模式:保留过去,预见未来
二十三种设计模式全面解析-深入探究备忘录模式:保留过去,预见未来
|
7月前
|
设计模式
二十三种设计模式-解密状态模式:优雅地管理对象状态
二十三种设计模式-解密状态模式:优雅地管理对象状态
101 0
|
设计模式 Java
状态切换:解析Java设计模式中的状态模式
在软件开发领域,设计模式是一组经过验证的最佳实践方法,用于解决各种常见问题。状态模式是一种行为型设计模式,其目标是将对象的不同状态抽象成不同的状态类,并允许对象在不同状态间进行切换。在本文中,我们将深入了解状态模式的核心思想、应用场景以及它在Java中的实际运用。
247 0
|
设计模式 算法 C++
2023-7-12-第十七式状态模式
2023-7-12-第十七式状态模式
73 0