Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mari bercakap tentang mod memo dalam PHP

Mari bercakap tentang mod memo dalam PHP

青灯夜游
青灯夜游ke hadapan
2021-07-20 19:25:152195semak imbas

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.

Mari bercakap tentang mod memo dalam 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.

Rajah dan penjelasan kelas Gof

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:

Mari bercakap tentang mod memo dalam PHP

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.

  • Secara terang-terangan, mod memo ialah membenarkan kelas luar B menyimpan keadaan dalaman A, dan kemudian memulihkan keadaan ini dengan mudah pada masa yang sesuai.
  • Sebenarnya terdapat banyak senario aplikasi untuk mod memo, termasuk rollback penyemak imbas, sandaran dan pemulihan pangkalan data, sandaran dan pemulihan sistem pengendalian, buat asal dan buat semula dokumen, penyesalan catur dan permainan kad, dll.
  • Mod ini boleh mengekalkan enkapsulasi pemula, iaitu, keadaan ini perlu disembunyikan daripada objek luaran, jadi ia hanya boleh diserahkan kepada objek memo untuk merekodkan kemungkinan menyalin keadaan
  • antara pemula dan memo. Ia akan membawa masalah prestasi, terutamanya keadaan dalaman kompleks objek besar, dan ia juga akan membawa beberapa kelemahan pengekodan, seperti kehilangan beberapa keadaan

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

Contoh

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

Mari bercakap tentang mod memo dalam PHP

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 = &#39;未发送&#39;;
        $this->time = time();
    }

    public function Show()
    {
        echo $this->to, &#39;---&#39;, $this->content, &#39;---&#39;, $this->time, &#39;---&#39;, $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(&#39;手机号&#39; . $i, &#39;内容&#39; . $i);
    echo &#39;初始状态:&#39;;
    $m->Show();

    // 保存初始信息
    $sc = new StateContainer();
    $sc->SetSaveState($m->CreateSaveSate());
    $scList[] = $sc;

    // 模拟短信发送,2发送成功,3发送失败
    $pushState = mt_rand(2, 3);
    $m->SetState($pushState == 2 ? &#39;发送成功&#39; : &#39;发送失败&#39;);
    echo &#39;发布后状态:&#39;;
    $m->Show();

    $mList[] = $m;
}

// 模拟另一个线程查找发送失败的并把它们还原到未发送状态
sleep(2);
foreach ($mList as $k => $m) {
    if ($m->GetState() == &#39;发送失败&#39;) { // 如果是发送失败的,还原状态
        $m->SetSaveState($scList[$k]->GetSaveState());
    }
    echo &#39;查询发布失败后状态:&#39;;
    $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!

Kenyataan:
Artikel ini dikembalikan pada:juejin.cn. Jika ada pelanggaran, sila hubungi admin@php.cn Padam