码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式之行为型模式—— 3.7 备忘录模式

时间:2015-02-17 23:40:26      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:设计模式 备忘录模式

<?php

	/**
	 * 3.7 备忘录模式
	 * 	定义:
	 * 		在不破坏封装性的前提下,捕获一个对象的内
	 * 		部状态,并在该对象之外保存这个状态,这样
	 * 		以后就可将该对象恢复到原先保存的状态。
	 *
	 * 角色:
	 * 		1. 发起人(Originator)类
	 * 			职责:负责创建一个备忘录Memento,用以
	 * 				  记录当前时刻它的内部状态,并可
	 * 				  使用备忘录恢复内部状态。Originator
	 * 				  可根据需要决定Memento存储它的哪
	 * 				  些内部状态。
	 * 		2. 备忘录(Memento)类
	 * 	 		职责:负责存储Originator对象的内部状态
	 * 	 			  ,并可防止Originator以外的其他对
	 * 	 			  象访问备忘录Memento。备忘录有两个
	 * 	 			  接口,Caretaker只能看到备忘录的窄
	 * 	 			  接口,它只能将备忘录传递给其他对
	 * 	 			  象。Originator能够看到一个宽接口
	 * 	 			  ,允许它访问返回先前状态所需的所有
	 * 	 			  数据。
	 * 		3. 管理者(Caretaker)类
	 * 			职责:负责保存好备忘录Memento,不能对备忘
	 * 				  录的内容同进行操作或检查。
	 *
	 * 	优点:
	 * 		1. 使用备忘录模式,可以避免暴露一些只应由
	 * 		   
	 * 		
	 * 	缺点:
	 * 		1. 有时一些发起人对象的内部信息必须保存在
	 * 		   发起人对象以外的地方,但是必须有发起人
	 * 		   对象自己读取,这时使用备忘录模式可以把
	 * 		   复杂的发起人内部信息对其他的对象屏蔽起
	 * 		   来,从而可以恰当的保持封装的边界。
	 * 		2. 本模式简化了发起人类。发起人不在需要管
	 * 		   理和保存内部状态的一个个版本,客户端可
	 * 		   以自己管理他们所需要的这些状态的版本。
	 * 		3. 当发起人角色的状态改变的时候,有可能这
	 * 		   个状态无效,这时候,就可以使用暂时存储
	 * 		   起来的备忘录状态复原。
	 *
	 * 	使用场景:
	 * 		1. 比较适用于功能比较复杂的,但需要维护或
	 * 		   记录属性历史的类;
	 * 		2. 需要保存的属性只是众多属性中的一小部分
	 * 		   时。
	 *
	 * 	
	 */

	//发起人类
	class Originator{
		//需要保存的属性,可以有多个
		private $state;
		public function setState($state){
			$this->state=$state;
		}
		public function getState(){
			return $this->state;
		}
		//创建备忘录,将当前需要保存的信息导入并
		//实例化出一个Memento对象
		public function CreateMemento(){
			return new Memento($this->state);
		}
		//恢复备忘录,将Memento导入并将相关数据恢复
		public function setMemento(Memento $memento){
			$this->state=$memento->getState();
		}
		//显示数据
		public function show(){
			echo ‘状态:‘.$this->state;
		}
	}
	//备忘录类
	class Memento{
		private $state;
		public function __construct($state){
			$this->state=$state;
		}
		public function getState(){
			return $this->state;
		}
	}
	//管理者类
	//用来管理备忘录
	class Caretaker{
		private $memento;
		public function setMemento(Memento $memento){
			$this->memento=$memento;
		}
		public function getMemento(){
			return $this->memento;
		}
	}

	// 客户端
	// 创建需要备忘录保存状态的对象
	$originator=new Originator();
	//初始状态属性为On
	$originator->setState(‘On‘);
	$originator->show();
	//生成备忘录的管理器以便保存状态
	$caretaker=new Caretaker();
	$caretaker->setMemento($originator->CreateMemento());
	$originator->setState(‘Off‘);
	$originator->show();

	//恢复初始状态
	$originator->setMemento($caretaker->getMemento());
	$originator->show();
?>


本文出自 “一切皆有可能” 博客,请务必保留此出处http://noican.blog.51cto.com/4081966/1614790

设计模式之行为型模式—— 3.7 备忘录模式

标签:设计模式 备忘录模式

原文地址:http://noican.blog.51cto.com/4081966/1614790

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!