zoukankan      html  css  js  c++  java
  • (十三)备忘录模式-代码实现

    介绍

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

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

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

    代码:

    //游戏类

    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人

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

  • 相关阅读:
    【LeetCode】Validate Binary Search Tree
    【LeetCode】Search in Rotated Sorted Array II(转)
    【LeetCode】Search in Rotated Sorted Array
    【LeetCode】Set Matrix Zeroes
    【LeetCode】Sqrt(x) (转载)
    【LeetCode】Integer to Roman
    贪心算法
    【LeetCode】Best Time to Buy and Sell Stock III
    【LeetCode】Best Time to Buy and Sell Stock II
    CentOS 6 上安装 pip、setuptools
  • 原文地址:https://www.cnblogs.com/qinggege/p/5239407.html
Copyright © 2011-2022 走看看