23种设计模式之备忘录模式

注意事项:

  • 备忘录的生命期,要主动管理它的生命周期,建立就要使用,不使用就删除;
  • 备忘录的性能,不要在频繁建立备份的场景中使用备忘录模式,频繁创建对象时需要消耗资源的;

主要用于保存某个对象内部状态的拷贝,以便可以将该对象恢复到原先状态。

角色:

  • 源发器类Originator:用于保存内部状态。
  • 备忘录类Memento:用于拷贝。
  • 负责人类CareTake:用于存储备忘录。

例子:从简,人物对象资料回滚。

创建人物实体类(源发器类Originator):

/**
 * 源发器类Originator:用于保存内部状态。
 */

public class Person {
    private String name;
    private String sex;
    private int age;

    public Person(String name, String sex, int age) {
        this.name = name;
        this.sex = sex;
        this.age = age;
    }

    //备忘操作并且返回备忘对象。
    public PersonMemento memento() {
        return new PersonMemento(this);
    }

    //回滚方法,回滚到备份时的状态
    public void rollback(PersonMemento personMemento) {
        this.name = personMemento.getName();
        this.sex = personMemento.getSex();
        this.age = personMemento.getAge();
    }

    public String getName() {
        return name;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

创建备忘录类(备忘录类Memento):

/**
 * 备忘录类Memento:用于拷贝。
 */

public class PersonMemento {

    private String name;
    private String sex;
    private int age;

    public PersonMemento(Person person) {
        this.name = person.getName();
        this.sex = person.getSex();
        this.age = person.getAge();
    }

    public String getName() {
        return name;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

创建负责人类(负责人类CareTake):

/**
 * 负责人类CareTake:用于存储备忘录。
 */

public class CareTake {

    //这是单次备忘,多次备忘可使用容器
    private PersonMemento personMemento;

    public PersonMemento getPersonMemento() {
        return personMemento;
    }

    public void setPersonMemento(PersonMemento personMemento) {
        this.personMemento = personMemento;
    }
}

调用:

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentActivity;
import android.util.Log;

/**
 * 这是调用者
 */

public class MainActivity extends FragmentActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //创建负责人类,用于存储备忘录。
        CareTake careTake = new CareTake();

        //创建对象
        Person person = new Person("张三", "男", 18);
        Log.d("TAG", "创建的对象:" + person.getName() + "," + person.getSex() + "," + person.getAge());

        //备忘记录
        careTake.setPersonMemento(person.memento());

        //对刚创建的对象做修改
        person.setAge(26);
        Log.d("TAG", "修改的对象:" + person.getName() + "," + person.getSex() + "," + person.getAge());

        //使用备忘录回滚
        person.rollback(careTake.getPersonMemento());
        Log.d("TAG", "回滚的对象:" + person.getName() + "," + person.getSex() + "," + person.getAge());

    }
}

结果:
image.png

已完成测试!有不对的地方欢迎指出,感恩。

你可能感兴趣的:(23种设计模式之备忘录模式)