Rumah > Artikel > pembangunan bahagian belakang > Mari bercakap tentang mod memo dalam PHP
Dalam artikel sebelumnya "Analisis mendalam tentang corak pembina dalam PHP " kami memperkenalkan corak pembina dalam PHP Artikel ini akan membawa anda memahami corak memo dalam corak reka bentuk PHP.
Memo, nama sebenarnya menerangkan fungsinya dengan sangat jelas. Contoh biasa ialah fungsi arkib apabila kami pada asalnya bermain permainan cakera keras. Apabila anda bimbang tentang BOSS besar yang akan anda hadapi, anda biasanya menyimpan arkib kemajuan terlebih dahulu. Sekiranya cabaran itu gagal, anda boleh terus membaca arkib untuk memulihkan keadaan sebelum mencabar BOSS. Kemudian anda boleh berlatih sebentar dan kembali untuk menyelesaikan BOSS yang besar. Walau bagaimanapun, untuk berjaga-jaga, adalah idea yang baik untuk menyimpan fail sebelum mencabar BOSS. Contoh lain ialah Git atau Svn, alat pengurusan kod yang kami pengaturcara gunakan setiap hari. Setiap penyerahan adalah seperti sandaran arkib Apabila terdapat masalah dengan kod baharu, putar semula dan pulihkan. Ini semua adalah aplikasi biasa mod memo Mari kita lihat mod ini bersama-sama.
Takrifan GoF: Tangkap keadaan dalaman objek tanpa memusnahkan enkapsulasi dan Simpan keadaan ini di luar ini objek. Dengan cara ini, objek boleh dipulihkan kepada keadaan asalnya yang disimpan pada masa hadapan
Rajah kelas GoF:
Pelaksanaan kod:
class Originator { private $state; public function SetMeneto(Memento $m) { $this->state = $m->GetState(); } public function CreateMemento() { $m = new Memento(); $m->SetState($this->state); return $m; } public function SetState($state) { $this->state = $state; } public function ShowState() { echo $this->state, PHP_EOL; } }
Originator, juga dipanggil initiator. Ia mempunyai keadaan dalaman yang boleh berubah dalam keadaan yang berbeza. Apabila sesuatu peristiwa berlaku, keadaan ini perlu dipulihkan kepada keadaan asalnya. Di sini, kami mempunyai CreateMemento() untuk mencipta memo (arkib) dan SetMeneto() untuk memulihkan keadaan (membaca fail).
class Memento { private $state; public function SetState($state) { $this->state = $state; } public function GetState() { return $this->state; } }
Memo sangat mudah dan digunakan untuk merekod status. Menyimpan keadaan ini dalam bentuk objek membolehkan pemula membuat banyak arkib dengan mudah untuk merekodkan pelbagai keadaan.
class Caretaker { private $memento; public function SetMemento($memento) { $this->memento = $memento; } public function GetMemento() { return $this->memento; } }
Orang yang bertanggungjawab, juga dipanggil kelas pengurus, menyimpan memo dan mengeluarkan memo dari sini apabila diperlukan. Ia hanya bertanggungjawab untuk menyimpan dan tidak boleh mengubah suai memo. Dalam aplikasi yang kompleks, ini boleh dijadikan senarai, sama seperti permainan yang secara selektif boleh memaparkan berbilang rekod arkib untuk dipilih oleh pemain.
$o = new Originator(); $o->SetState('状态1'); $o->ShowState(); // 保存状态 $c = new Caretaker(); $c->SetMemento($o->CreateMemento()); $o->SetState('状态2'); $o->ShowState(); // 还原状态 $o->SetMeneto($c->GetMemento()); $o->ShowState();
Dalam panggilan pelanggan, pemula kami memulakan keadaan dan menyimpannya, kemudian menukar keadaan secara buatan. Pada masa ini, anda hanya perlu memulihkan status melalui orang yang bertanggungjawab.
Mesin masa Mac fungsi Semua orang tahu bahawa anda boleh memulihkan komputer anda kepada keadaan pada masa tertentu. Malah, Windows ghost juga mempunyai fungsi yang sama. Sistem pengendalian mudah alih kami juga memutuskan untuk membangunkan fungsi sedemikian. Apabila kami mengklik Sandaran Mesin Masa, semua maklumat, data dan maklumat status pada telefon akan dimampatkan dan disimpan Jika pengguna membenarkannya, kami akan memuat naik pakej yang dimampatkan ke pelayan awan kami untuk mengelak daripada menduduki memori telefon pengguna , ia akan Ia hanya boleh disimpan ke memori telefon mudah alih pengguna. Apabila telefon bimbit pengguna perlu dipulihkan pada masa tertentu, kami akan menyenaraikan semua sandaran mesin masa Pengguna boleh memulihkan status sistem telefon bimbit kepada keadaan pada masa itu hanya dengan satu klikan jari ia sangat mudah! !
Kod penuh: https://github.com/zhangyue0503/designpatterns-php/blob/master/17.memento/source/memento.php
Kali ini kita kembali kepada contoh menghantar mesej teks. Biasanya apabila kita melakukan fungsi seperti menghantar mesej teks atau e-mel, akan ada barisan yang membaca kandungan yang akan dihantar dari pangkalan data atau cache dan menghantarnya, jika ia gagal, statusnya mesej teks akan ditukar kepada gagal atau dihantar semula. Di sini, kami terus menukarnya kembali kepada keadaan tidak dihantar sebelumnya dan kemudian tunggu baris gilir penghantaran seterusnya untuk melakukan penghantaran semula.
SMS menghantar gambar rajah kelas
Kod sumber penuh: https://github.com/zhangyue0503/designpatterns- php /blob/master/17.memento/source/memento-message.php
<?php class Message { private $content; private $to; private $state; private $time; public function __construct($to, $content) { $this->to = $to; $this->content = $content; $this->state = '未发送'; $this->time = time(); } public function Show() { echo $this->to, '---', $this->content, '---', $this->time, '---', $this->state, PHP_EOL; } public function CreateSaveSate() { $ss = new SaveState(); $ss->SetState($this->state); return $ss; } public function SetSaveState($ss) { if ($this->state != $ss->GetState()) { $this->time = time(); } $this->state = $ss->GetState(); } public function SetState($state) { $this->state = $state; } public function GetState() { return $this->state; } } class SaveState { private $state; public function SetState($state) { $this->state = $state; } public function GetState() { return $this->state; } } class StateContainer { private $ss; public function SetSaveState($ss) { $this->ss = $ss; } public function GetSaveState() { return $this->ss; } } // 模拟短信发送 $mList = []; $scList = []; for ($i = 0; $i < 10; $i++) { $m = new Message('手机号' . $i, '内容' . $i); echo '初始状态:'; $m->Show(); // 保存初始信息 $sc = new StateContainer(); $sc->SetSaveState($m->CreateSaveSate()); $scList[] = $sc; // 模拟短信发送,2发送成功,3发送失败 $pushState = mt_rand(2, 3); $m->SetState($pushState == 2 ? '发送成功' : '发送失败'); echo '发布后状态:'; $m->Show(); $mList[] = $m; } // 模拟另一个线程查找发送失败的并把它们还原到未发送状态 sleep(2); foreach ($mList as $k => $m) { if ($m->GetState() == '发送失败') { // 如果是发送失败的,还原状态 $m->SetSaveState($scList[$k]->GetSaveState()); } echo '查询发布失败后状态:'; $m->Show(); }
说明
原文地址:https://juejin.cn/post/6844903983555805192
作者:硬核项目经理
推荐学习:《PHP视频教程》
Atas ialah kandungan terperinci Mari bercakap tentang mod memo dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!