2018/12/10《大话设计模式》【备忘录模式】

1:为什么要使用备忘录模式?

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

  - 在平常的需要备忘/快照的模式中,经常需要客户端来进行操作来进行复杂操作保存等逻辑。

  - 哎~,这个越说越晦涩,就这么说吧,不用修改基类,你想保存这个对象之前的状态,就是用这个就好了

  - 就类似备忘录一样

2:备忘录模式的应用场景?

  - 在《大话涉及模式中也指出》

  - 适合功能比较复杂的历史功能这样的类,或者简单存储的属性。

3:备忘录模式的简单实现

<?php
/**
 * 备忘录模式
 * 这里的状态模式可以使用 数据库/Redis 等
 */
// 发起人
class Originator
{
    public $state;

    // 创建备忘录
    public function createMemento($state)
    {
        return (new Memento($state));
    }

     // 恢复备忘录
    public function setMemento(Memento $memento)
    {
        $this->state = $memento->state;
    }

    // 展示数据
    public function show()
    {
        print_r($this->state);
    }
}

// 备忘录
class Memento
{
    public function __construct($state)
    {
        $this->state = $state;
    }
}

// 客户端使用
class Client
{
    public static function main()
    {
       $Originator = new Originator();

       // 当前状态
       $Originator->state = [‘能量‘ => ‘100‘, ‘魔法‘ => ‘100‘];

       // 保存当前状态
       $Memento = new Memento($Originator->state);
       $Originator->createMemento($Memento);

       // 打怪 - 能量减低
       $Originator->state = [‘能量‘ => ‘20‘, ‘魔法‘ => ‘10‘];

       // 当前状态
       $Originator->show();

       // 死亡 - 恢复备忘
       $Originator->setMemento($Memento);
       $Originator->show();

    }
}

Client::main($argv);

4:GITHUB

  github

原文地址:https://www.cnblogs.com/25-lH/p/10096896.html

时间: 2024-11-06 09:44:38

2018/12/10《大话设计模式》【备忘录模式】的相关文章

大话设计模式—备忘录模式

备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象.备忘录模式属于行为型模式.所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态.很多时候我们总是需要记录一个对象的内部状态,这样做的目的就是为了允许用户取消不确定或者错误的操作,能够恢复到他原先的状态,使得他有"后悔药"可吃. 大话设计模式中程杰老师给出的定义是,备忘录模式:在不破坏封装性的前提下,捕获一个对象的内

大话设计模式---备忘录模式

备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. Memento模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时,Originator可以根据保存的Memento信息还原到前一状态.

2.大话设计模式-策略模式

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace DesignModel 8 { 9 /// <summary> 10 /// 策略模式 11 /// </summary> 12 public class TacticsModel 13 { 14 //对于

5.大话设计模式-代理模式

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DesignModel { public class Proxy:IAction { ZQZ zzz = null; public Proxy(ZQZ mm) { zzz = mm; } public void SendFlower() { zzz

6.大话设计模式-工厂模式

工厂模式和简单工厂有什么区别.废话不多说,对比第一篇例子应该很清楚能看出来. 优点: 工厂模式弥补了简单工厂模式中违背开放-封闭原则,又保持了封装对象创建过程的优点. using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; namespace DesignModel{    public interface Factory   

【C#设计模式-备忘录模式】

一.备忘录模式的定义: 在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 二.备忘录模式的结构和角色: 1.Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态.Originator可以根据需要决定Memento存储自己的哪些内部状态. 2.Memento(备忘录):负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问

我的设计模式:备忘录模式

我的设计模式-备忘录模式 恢复到最初的状态-->对原始状态的保留和恢复 联想到的业务:cms稿件放入到回收站,永久记录状态得用到数据库啊,怎么办?备忘录模式的内存缓存不适用? 类的单一职责 boy职责:状态   改变状态  设置状态  获取状态 备忘录职责:记录当前的状态   恢复状态 迪 米特原则:最少知道原则,不和陌生人说话 问题:备忘录只是记录了一个节点,多个备忘录记录了多个节点,可以恢复到任意节点?备忘录因该支持多个节点? 思考问题:增加备忘录管理者manager角色,有啥好处呢?没体验

[转] Android中的设计模式-备忘录模式

转自Android中的设计模式-备忘录模式 定义 备忘录设计模式的定义就是把对象的状态记录和管理委托给外界处理,用以维持自己的封闭性. 比较官方的定义 备忘录模式(Memento Pattern)又叫做快照模式(Snapshot Pattern)或Token模式,是GoF的23种设计模式之一,属于行为模式. 定义:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 角色 笔记本:很多的内部状态需要被建立一个备忘录来管理,创建和取出

PHP设计模式——备忘录模式

声明:本系列博客參考资料<大话设计模式>,作者程杰. 备忘录模式又叫做快照模式或Token模式,在不破坏封闭的前提下.捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. UML类图: 角色: 1.发起人(GameRole):负责创建一个备忘录,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态.发起人能够依据须要决定备忘录存储自己的哪些内部状态. 2.备忘录(RoleStateSaveBox):负责存储发起人对象的内部状态,并能够防止发起人以