php-备忘录模式实现

概述

又叫做快照模式或Token模式,在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

还是以摩托制造厂为例,作为企业我们需要制定一套员工考勤制度,我们需要知道并记录员工的当月迟到状况,并与次月恢复初始化该员工的考勤状态,出于考勤的灵活性以及人性化我们允许员工单月可累计迟到300分钟不予处罚。本文实例将以张三李四两个员工为例

模式结构

  1. Memento - 备忘录类
  2. Originator - 备忘录管理器
  3. Staff - 员工考勤状态

图例

代码范例

<?php
namespace Memorandum;
//备忘录类
class Memento{public $_number;    //备忘录编号public $_name;       //员工姓名public $_sumLateMinute;   //迟到累计function __construct($number,$name,$sumLateMinute){$this->_number = $number;$this->_name = $name;$this->_sumLateMinute = $sumLateMinute;}
}
//备忘录管理器
class Originator{//备忘录列表public static $mementos = array();//单例private static $instance = null;//单例模式确保只有一个管理器private function __construct(){}//单例模式防止外部克隆private function __clone(){}//返回单例对象static function getInstance(){if(!(self::$instance instanceOf self)){self::$instance = new self();}return self::$instance;}//存备忘录function addMemento($id,Memento $memento){self::$mementos[$id] = $memento;}//取备忘录function getMemento($id){return self::$mementos[$id];}
}
//员工考勤
class Staff{private static $i = 0;  //静态变量累加用于给$id赋值public $_number; //每个对象独一无二,用于保存状态备忘录到管理器private $_name; //姓名private $_sumLateMinute;  //迟到分钟数private $_maxMinute;function __construct($name){$this->_name = $name;$this->_number = self::$i;self::$i++;}//初始化function init(){$this->_maxMinute = 300;$this->_sumLateMinute = 0;}//登记迟到行为function regLate($minute){$this->_sumLateMinute +=$minute;}//显示现有状态function displayState(){echo "姓  名:".$this->name."<br/>";echo "已迟到:".$this->_sumLateMinute." 分钟<br/>";if($this->_sumLateMinute <= $this->_maxMinute){$lates = $this->_maxMinute - $this->_sumLateMinute;echo "剩余可迟到 ".$lates." 分钟 超出部分将处以罚款<br />";}else{echo "已超出,将被处以罚款 <br />";}}//保存状态到一个备忘录中,该备忘录将被放置到管理器中function saveState(){$originator = Originator::getInstance();$originator->addMemento($this->id,new Memento($this->_number,$this->_name,$this->_sumLateMinute));}//恢复备忘录function resetState(){$originator = Originator::getInstance();$memento = $originator->getMemento($this->id);$this->_number = $memento->_number;$this->_name = $memento->_name;$this->_sumLateMinute = $memento->_sumLateMinute;}
}
echo "-------------------张三考勤数据---------------------<br />";
$staffA = new Staff("张三");
$staffA->init();
$staffA->saveState();
$staffA->regLate(10);
$staffA->displayState(); //查看状态
$staffA->regLate(20);
$staffA->displayState(); //查看状态
echo "-------------------李四考勤数据---------------------<br />";
$staffB = new Staff("李四");
$staffB->init();
$staffB->saveState();
$staffB->regLate(50);
$staffB->displayState(); //查看状态
$staffB->regLate(300);
$staffB->displayState(); //查看状态
echo "-------------------重置后的数据---------------------<br />";
//重置张三的考勤数据
$staffA->resetState();
$staffA->displayState(); //查看状态
//重置李四的考勤数据
$staffB->resetState();
$staffB->displayState(); //查看状态

模式分析

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

优缺点

备忘录模式优点:
1、有时一些发起人对象的内部信息必须保存在发起人对象以外的地方,但是必须要由发起人对象自己读取,这时,使用备忘录模式可以把复杂的发起人内部信息对其他的对象屏蔽起来,从而可以恰当地保持封装的边界。
2、本模式简化了发起人类。发起人不再需要管理和保存其内部状态的一个个版本,客户端可以自行管理他们所需要的这些状态的版本。
备忘录模式缺点:
1、如果发起人角色的状态需要完整地存储到备忘录对象中,那么在资源消耗上面备忘录对象会很昂贵。
2、当负责人角色将一个备忘录存储起来的时候,负责人可能并不知道这个状态会占用多大的存储空间,从而无法提醒用户一个操作是否很昂贵。

适用环境

1、必须保存一个对象在某一个时刻的(部分)状态,这样以后需要时它才能恢复到先前的状态。
2、如果一个用接口来让其它对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。

关注微信公众号(yuantanphp)
回复关键字 设计模式 可获取以下材料
《设计模式:可复用面向对象软件的基础》pdf版.
php设计模式23种实例实现php源码

php-备忘录模式实现相关推荐

  1. 设计模式之备忘录模式(Memento)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  2. java备忘录模式应用场景_图解Java设计模式之备忘录模式

    图解Java设计模式之备忘录模式 游戏角色状态恢复问题 游戏角色有攻击力和防御力,在大战Boss前保存自身的状态(攻击力和防御力),当大战Boss后攻击力和防御力下降,从备忘录对象恢复到大战前的状态. ...

  3. 设计模式(行为型模式)——备忘录模式(Memento)

    2019独角兽企业重金招聘Python工程师标准>>> 本章讲讲第三类和第四类. 备忘录模式(Memento) 主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象,个人觉得叫 ...

  4. 《JAVA与模式》之备忘录模式

    备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式. 备忘录对象是一个用来存储另外一个对象内部状态的快照的对象.备忘录模式的用意是在不破坏封装的条件下,将一 ...

  5. Python设计模式-备忘录模式

    Python设计模式-备忘录模式 代码基于3.5.2,代码如下; #coding:utf-8 #备忘录模式 import randomclass gameCharacter():vitality = ...

  6. 【设计模式】备忘录模式

    备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象.备忘录模式属于行为型模式. 介绍 意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存 ...

  7. 备忘录模式(Memento)的原版与简化版实现

    备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 适用场景: 1.保存一个对象在某一个时刻的(部分) ...

  8. Java设计模式(备忘录模式-解释器模式-状态模式-策略模式-职责链模式)

    Java设计模式Ⅶ 1.备忘录模式 1.1 备忘录模式概述 1.2 代码理解 2.解释器模式 2.1 解释器模式概述 3.状态模式 3.1 状态模式概述 3.2 代码理解 4.策略模式 4.1 策略模 ...

  9. php在线备忘录,备忘录模式(Memento)

    namespace DesignPatterns\Behavioral\Memento\Tests; use DesignPatterns\Behavioral\Memento\Caretaker; ...

  10. 设计模式 — 行为型模式 — 备忘录模式

    目录 文章目录 目录 备忘录模式 应用场景 代码示例 备忘录模式 备忘录模式,在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 简单 ...

最新文章

  1. Order笔记-数据库创建
  2. 【Go API 开发实战】Go API 开发实战教程简介(1-7)
  3. java删除javaee_JavaEE--集合--删除List中指定元素
  4. Oracle函数的信息,Oracle中获取会话信息的两个函数分享
  5. 解决Zend OPcache huge_code_pages: mmap(HUGETLB) fail
  6. GRIDVIEW中实现上移下移的存储过程
  7. selenium+java自动化测试环境搭建mac
  8. 日常如何维护OA系统?
  9. matlab仿真模糊PID控制,模糊PID控制及其MATLAB仿真
  10. CAD制图初学入门:CAD软件中属性定义的相关应用
  11. 音视频聊天开发: 1 视频采集
  12. (附源码)PHP疫情上报管理系统 毕业设计 170948
  13. 区块链专利正从量向质转变 智慧金融、医疗健康和能源三领域质量最高
  14. Knowledge 7一阶谓词逻辑-Generalized Modus Ponens规则
  15. 数学建模学习:因子分析
  16. 软件测试周刊(第32期):沙漠中藏着一口井
  17. 处理安全检查的项目代码异常解决记录
  18. Strings的用法
  19. 计算机无法找到网络打印机,为何搜索不到局域网打印机_解决win7找不到网络打印机的问题...
  20. usg防火墙l2tp ipsec安全策略

热门文章

  1. 苹果隐藏应用_如何在iOS 14上隐藏应用页?苹果手机上管理应用更方便
  2. 【重磅】写了400多页的Java面试八股文PDF,面试必备
  3. 通过SignalR技术整合即时通讯(IM)在.NET敏捷开发框架中落地
  4. 蓝湖ui设计图直接转换html,蓝湖使用规范(用于管理UI及前端切图)
  5. MVC 医院管理住院系统的研究与实现 毕业设计-附源码02134
  6. Photoshop cc2015 批量切割图片
  7. blender怎么移动骨骼,摸索Blender:绑定骨骼
  8. vr运动控制器绑定骨骼运动
  9. W3Schools SQL Quiz
  10. 联想“推翻”常程:杨元庆“杯酒释兵权”?