この記事では主に PHP デザインモードのメモモードを紹介し、PHP を使用してメモモードを実装します。興味のある方は参考にしてください。お役に立てれば幸いです。
1. 意図
カプセル化を破壊することなく、オブジェクトの内部状態をキャプチャし、この状態をオブジェクトの外部に保存します。これにより、後でオブジェクトの状態を以前に保存した状態に復元できます。
2. メモモードの構造図
3. メモモードの主な役割
1. メモの役割:
は発信元オブジェクトの内部状態を格納し、エイターが決める必要に応じてメモに保存されるイニシエータの内部状態。
メモは、Originator オブジェクト以外のオブジェクトによって内容が読み取られないように保護できます。
2. 作成者の役割:
現在の内部状態を含むメモオブジェクトを作成します
その内部状態を保存するためにメモオブジェクトを使用します
3. 管理者の役割:
メモオブジェクトの内容を保存する責任があります。メモ オブジェクトはチェックされません
4. メモ パターンの長所と短所
メモ パターンの利点:
1. イニシエーター オブジェクトの一部の内部情報をイニシエーター オブジェクトの外部に保存する必要がある場合があります。イニシエーター オブジェクト自体によって読み取られます。 2. Originator クラスを簡素化しました。オリジネーターは、内部状態のバージョンを管理および保存する必要がなくなり、クライアントは必要なこれらの状態のバージョンを自分で管理できるようになります。 3. オリジネーター ロールのステータスが変更されると、ステータスが無効になる可能性があります。一時的に保存したメモを使用して状態を復元できます。
メモ パターンの欠点:
1. イニシエーター ロールのステータスをメモ オブジェクトに完全に保存する必要がある場合、メモ オブジェクトはリソース消費の点で非常に高価になります。 2. 担当者がメモを保存する場合、そのステータスがどのくらいのストレージスペースを占めるかが分からないため、操作にコストがかかるかどうかをユーザーに通知することができません。
3. イニシエーターロールのステータスが変更されると、ステータスが無効になる可能性があります。
5. メモモードの適用可能なシナリオ
1. 将来必要になったときに以前の状態に復元できるように、ある時点のオブジェクトの(部分的な)状態を保存する必要があります。
2. 他のオブジェクトがこれらの状態を直接取得できるようにインターフェイスを使用すると、オブジェクトの実装の詳細が公開され、オブジェクトのカプセル化が破棄されます。
6. Memento モードとその他のモード
1. コマンド モード (コマンド モード): コマンド モードは、通常、オブジェクトの状態の復元にも使用できますが、コマンド モードはマルチレベルの状態のロールバックをサポートします。単なる復元(スナップショット)です。コマンド モードの各取り消しでは、Memento を使用してオブジェクトの状態を保存できます。
2. イテレーターモード(Iterator mode): 反復にメモを使用できます
7. メモモードのPHPサンプル<?php
/**
* 发起人(Originator)角色
*/
class Originator {
private $_state;
public function __construct() {
$this->_state = '';
}
/**
* 创建备忘录
* @return Memento 包含当前状态的备忘录对象
*/
public function createMemento() {
return new Memento($this->_state);
}
/**
* 将发起人恢复到备忘录对象记录的状态上
* @param Memento $memento
*/
public function restoreMemento(Memento $memento) {
$this->_state = $memento->getState();
}
public function setState($state) {
$this->_state = $state;
}
public function getState() {
return $this->_state;
}
/**
* 测试用方法,显示状态
*/
public function showState() {
echo "Original Status:", $this->getState(), "<br />";
}
}
/**
* 备忘录(Memento)角色
*/
class Memento {
private $_state;
public function __construct($state) {
$this->setState($state);
}
public function getState() {
return $this->_state;
}
public function setState($state) {
$this->_state = $state;
}
}
/**
* 负责人(Caretaker)角色
*/
class Caretaker {
private $_memento;
public function getMemento() {
return $this->_memento;
}
public function setMemento(Memento $memento) {
$this->_memento = $memento;
}
}
/**
* 客户端
*/
class Client {
/**
* Main program.
*/
public static function main() {
/* 创建目标对象 */
$org = new Originator();
$org->setState('open');
$org->showState();
/* 创建备忘 */
$memento = $org->createMemento();
/* 通过Caretaker保存此备忘 */
$caretaker = new Caretaker();
$caretaker->setMemento($memento);
/* 改变目标对象的状态 */
$org->setState('close');
$org->showState();
/* 还原操作 */
$org->restoreMemento($caretaker->getMemento());
$org->showState();
}
}
Client::main();
?>
以上がPHPデザインパターンメモパターンの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。