备忘录模式:设计模式系列(二十)

  备忘录模式(Memento Pattern):是一种通过一备忘录类获取目标对象的状态并保存,在需要的时候再从中获取返回状态的设计模式,归类为行为型模式。

  这一模式的解读分为以下几个方面:

  • 目标对象状态需要被保存。
  • 备忘录实现类能获取目标对象中的状态并保存。
  • 备忘录实现类对象需要被管理,在需要的时候才能被目标对象取回状态。

  使用备忘录模式的思考过程如下:

  1. 一个独立的类实现对象在运行过程中状态可能会改变,且有可能需要回到曾经的状态。
  2. 备忘录类可以获取对象的状态并充当保存的容器,被管理类实例对象管理。
  3. 当独立的类实现对象需要回到曾经的状态时,管理类实例对象就要把备忘录类实例对象中保存了的状态返回给目标对象。

  明确一下结构,备忘录模式结构包含独立的类实现类、备忘录类、备忘录管理类。

备忘录模式示例代码如下(Swift语言):

class Object{
    
    var state1:Int;
    var state2:String;
    
    init(state1:Int,state2:String){
        self.state1 = state1;
        self.state2 = state2;
    }
    
    func setState1(state1:Int){
        self.state1 = state1;
    }
    
    func setState2(state2:String){
        self.state2 = state2;
    }
    
    func store(id:Int)->Memento{
        return Memento(id:id,state1: self.state1,state2: self.state2);
    }
    
    func restore(memento:Memento){
        self.state1 = memento.getState1();
        self.state2 = memento.getState2();
    }
    
    func show(){
        print("state1:\(self.state1),state2:\(self.state2)");
    }
}

class Memento{
    
    var id:Int;
    private var state1:Int;
    private var state2:String;
    
    init(id:Int,state1:Int,state2:String){
        self.id = id;
        self.state1 = state1;
        self.state2 = state2;
    }
    
    func getState1()->Int{
        return self.state1;
    }
    
    func getState2()->String{
        return self.state2;
    }
}

class MementoManager{
    
    private var memento:[Memento]?;
    
    func getMemento(id:Int)->Memento?{
        for(var i = 0;i < self.memento?.count;i++){
            if(self.memento![i].id == id){
                return self.memento![i];
            }
        }
        return nil;
    }
    
    func setMemento(memento:Memento){
        if(self.memento == nil){
            self.memento = [Memento]();
        }
        self.memento!.append(memento);
    }
}

var object = Object(state1:1,state2: "One");
var manager = MementoManager();

manager.setMemento(object.store(0));    //让MementoManager实例对象 添加 保存了Object实例对象状态 的 Memento实例对象
object.show();

object.setState1(2);
object.setState2("Two");
manager.setMemento(object.store(1));
object.show();

object.restore(manager.getMemento(0)!);
object.show();

object.restore(manager.getMemento(1)!);
object.show();

  代码分析:从以上代码中看一看到Object类的实例化对象object的状态会在运行中改变,所以想要恢复为曾经的状态就需要保存现有的状态,Object类中方法store就是把当前状态保存至备忘录类Memento的实例化对象中,而保存起来的Memento实例化对象将被管理备忘录类MementoManager的实例化对象manager以数组形式属性memento`保存起来,之后,当状态被setState1setState2方法改变后,可以调用restore方法通过manager获取Memento对应id`的状态备忘录以恢复对象的属性。以上代码的输出结果如下:

state1:1,state2:One
state1:2,state2:Two
state1:1,state2:One
state1:2,state2:Two

  总结:备忘录模式是一种记录对象状态的模式,而备忘鹿实例对象与目标对象是互相独立的,这就让目标对象不需要自己管理备份,防止臃肿,而把备忘录实例化对象交给管理备忘录的类实例化对象管理,可灵活地使用备忘录类。


lZackx © 2022. All rights reserved.

Powered by Hydejack v9.1.6