备忘录模式实战运用(对象快照与恢复)

本文介绍了备忘录模式的概念,通过UML类图展示了三个角色(Originator、Memento和CareTaker),并给出了Java代码示例,演示如何创建对象副本并恢复历史状态。
摘要由CSDN通过智能技术生成

目录

前言

UML

plantuml

类图

实战代码

模板

Originator

Memento

CareTaker

Client


前言

使用备忘录模式,主要目的就是创建对象副本,保存对象内部状态的的快照,以便在需要时恢复对象至某一个历史状态。

仅仅从创建副本来看,备忘录模式和原型模式其实没啥区别,不过备忘录模式是行为型设计模式,重点在于恢复对象到某一历史状态。

备忘录模式下,总共有三个角色,原始对象 Originator,对象快照 Memento,以及管理它们的 CareTaker

UML

plantuml

@startuml
'https://plantuml.com/class-diagram

class Originator {
    - attr : type
    + createMemento() : Memento
    + restore(Memento) : void
}

class Memento {
    - attr : type
}

class CareTaker {
    - originator : Originator
    - mementos : List<Memento>
    + createMemento() : void
    + restore(int) : void
}

class Client {}

Originator ..> Memento
CareTaker "1" --> "1" Originator
CareTaker "1" --> "n" Memento

Client -->  CareTaker
Client -->  Originator

@enduml

类图

实战代码

模板

Originator

class Originator {
    String state;

    Originator(String state) {
        this.state = state;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    public Memento createMemento() {
        Memento memento = new Memento();
        memento.setState(this.state);
        return memento;
    }

    public void restore(Memento memento) {
        this.state = memento.getState();
    }
}

Memento

public class Memento {
    private String state;

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }
}

CareTaker

class CareTaker {
    Originator originator;
    List<Memento> mementos;

    CareTaker(Originator originator) {
        this.originator = originator;
        mementos = new ArrayList<>();
    }

    public void createMemento() {
        Memento memento = this.originator.createMemento();
        mementos.add(memento);
    }

    public void restore(int index) {
        this.originator.restore(mementos.get(index));
    }
}

Client

public class Client {
    public static void main(String[] args) {
        Originator originator = new Originator("init");
        CareTaker careTaker = new CareTaker(originator);

        System.out.println(originator.getState());

        careTaker.createMemento();

        originator.setState("run");

        careTaker.createMemento();

        System.out.println(originator.getState());

        careTaker.restore(0);

        System.out.println(originator.getState());
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值