• (十三)备忘录模式-代码实现


    介绍

    概念:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

    应用场景:需要保存某个对象的某个时间的状态,如游戏的暂停,存档,恢复功能. 如果把数据库与实体关联起来了,也可以说数据库是这个对象的备忘录.

    接来下实现一个游戏存档与读档的功能

    代码:

    //游戏类

    package note.com.memento;
    
    import java.math.BigDecimal;
    import java.util.ArrayList;
    
    public class DiningRoom {
        private Integer waiter = 1;//服务员初始1
        private String name = "default";//默认名称
        private BigDecimal money  = new BigDecimal(500);//初始金钱500
        private ArrayList<String> foods = new ArrayList<String>();
        
        public DiningRoom(){
            foods.add("小鸡炖蘑菇");
            foods.add("剁椒鱼头");
            foods.add("狗不理包子");
        }
        
        /*
         * 读档
         */
        public DiningRoom(SaveGame game){
            this.waiter = game.getWaiter();
            this.name = game.getName();
            this.money = game.getMoney();
            this.foods = game.getFoods();
            System.out.println("读取档案....");
            draw();
        }
        
        /*
         * 开始游戏
         */
        public void start(){
            System.out.println("游戏开始......");
            draw();
        }
        
        public void draw(){
            System.out.println("绘制显示......");
        }
        
        public void openDoor(){
            System.out.println("开业");
        }
        
        public void closeDoor(){
            System.out.println("打烊");
        }
        
        /*
         * 恢复游戏
         */
        public void back(SaveGame game){
            this.waiter = game.getWaiter();
            this.name = game.getName();
            this.money = game.getMoney();
            this.foods = game.getFoods();
            System.out.println("恢复档案...");
            draw();
        }
        
        /*
         * 存档
         */
        public SaveGame save(){
            return new SaveGame(this); 
        }
        
        public void show(){
            System.out.println("餐厅名称:"+this.name);
            System.out.println("余额:"+this.money.toString());
            System.out.println("服务员:"+this.waiter+"人");
        }
    
        public Integer getWaiter() {
            return waiter;
        }
    
        public void setWaiter(Integer waiter) {
            this.waiter = waiter;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public BigDecimal getMoney() {
            return money;
        }
    
        public void setMoney(BigDecimal money) {
            this.money = money;
        }
    
        public ArrayList<String> getFoods() {
            return foods;
        }
    
        public void setFoods(ArrayList<String> foods) {
            this.foods = foods;
        }
        
        
        
    }

    //存档实体

    package note.com.memento;
    
    import java.math.BigDecimal;
    import java.util.ArrayList;
    
    /**
     * 存档
     * @author lxz
     *
     */
    public class SaveGame {
        private Integer waiter = 1;//服务员初始1
        private String name = "default";//默认名称
        private BigDecimal money  = new BigDecimal(500);//初始金钱500
        private ArrayList<String> foods = new ArrayList<String>();
        public SaveGame(DiningRoom room){
            this.waiter = room.getWaiter();
            this.name = room.getName();
            this.money = room.getMoney();
            this.foods = room.getFoods();
        }
        
        
        public Integer getWaiter() {
            return waiter;
        }
        public void setWaiter(Integer waiter) {
            this.waiter = waiter;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public BigDecimal getMoney() {
            return money;
        }
        public void setMoney(BigDecimal money) {
            this.money = money;
        }
        public ArrayList<String> getFoods() {
            return foods;
        }
        public void setFoods(ArrayList<String> foods) {
            this.foods = foods;
        }
    
        
    }

    //测试类

    package note.com.memento;
    
    import java.math.BigDecimal;
    
    public class MementoTest {
        public static void main(String[] args) {
            DiningRoom game = new DiningRoom();
            game.show();
            game.start();
            game.setMoney(new BigDecimal(2000));
            game.setName("小洋人");
            game.show();//显示当前状态
            SaveGame save1 = game.save();
            game.setName("大洋人");
            game.show();//显示当前状态
            game.back(save1);//恢复到修改名称之前
            game.show();//恢复后状态
            
            //===================重新打开游戏
            System.out.println("=====重新开始=======");
            DiningRoom game2 = new DiningRoom(save1);//重新打开游戏读取存档
            game2.show();//存档状态
        }
    }

    //结果

    餐厅名称:default
    余额:500
    服务员:1人
    游戏开始......
    绘制显示......
    餐厅名称:小洋人
    余额:2000
    服务员:1人
    餐厅名称:大洋人
    余额:2000
    服务员:1人
    恢复档案...
    绘制显示......
    餐厅名称:小洋人
    余额:2000
    服务员:1人
    =====重新开始=======
    读取档案....
    绘制显示......
    餐厅名称:小洋人
    余额:2000
    服务员:1人

    备忘录模式是比较容易理解的了.

  • 相关阅读:
    https://www.cnblogs.com/aademeng/category/1042475.html
    python中重要的模块--asyncio 转载
    await这个关键词以及asyncio.wait asyncio.gather
    async get_event_loop
    麦克米伦7000
    [GO]errorr接口的使用
    [GO]断言
    [GO]空接口
    [GO]接口的转换
    [GO]接口的嵌用继承
  • 原文地址:https://www.cnblogs.com/qinggege/p/5239407.html
Copyright © 2020-2023  润新知