目次
Gof クラス図と説明
SMS 送信クラス図
ホームページ バックエンド開発 PHPチュートリアル PHPのメモモードについて話しましょう

PHPのメモモードについて話しましょう

Jul 20, 2021 pm 07:25 PM
php メモモード デザインパターン

前回の記事「PHPのビルダーパターンの詳細分析」ではPHPのビルダーパターンについて紹介しましたが、次の記事ではPHPデザインパターンのメモパターンについて理解していきます。

PHPのメモモードについて話しましょう

メモ、この名前は実際にその機能を非常にわかりやすく説明しています。典型的な例は、もともとハードディスクゲームをプレイしたときのアーカイブ機能です。これから直面する大きなボスが心配なときは、通常、最初に進行状況のアーカイブを保存します。挑戦に失敗した場合は、アーカイブを直接読み込んでBOSSに挑戦する前の状態に戻すことができ、しばらく楽しく練習して再び大BOSSを解くことができます。ただし、念のため、BOSS に挑戦する前にファイルを保存しておくことをお勧めします。もう 1 つの例は、プログラマーが毎日使用するコード管理ツールである Git または Svn です。各提出はアーカイブのバックアップのようなもので、新しいコードに問題がある場合は、ロールバックして回復するだけです。これらはメモモードの代表的な応用例ですので、一緒に見ていきましょう。

Gof クラス図と説明

GoF 定義: カプセル化を破壊することなくオブジェクトの内部状態をキャプチャし、この状態をこの外部に保存します。物体。このようにして、オブジェクトを元の保存状態に復元できます

#GoF クラス図:

PHPのメモモードについて話しましょう

##コード実装:

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;
    }
}
ログイン後にコピー
発信者は開始者とも呼ばれます。さまざまな状況下で変化する可能性のある内部状態があります。イベントが発生すると、この状態を元の状態に戻す必要があります。ここでは、メモ (アーカイブ) を作成するための CreateMemento() と、状態を復元する (ファイルの読み取り) ための SetMeneto() があります。

class Memento
{
    private $state;
    public function SetState($state)
    {
        $this->state = $state;
    }
    public function GetState()
    {
        return $this->state;
    }
}
ログイン後にコピー

メモは非常にシンプルで、ステータスを記録するために使用されます。この状態をオブジェクトの形式で保存すると、作成者はさまざまな状態を記録する多数のアーカイブを簡単に作成できます。

class Caretaker
{
    private $memento;
    public function SetMemento($memento)
    {
        $this->memento = $memento;
    }
    public function GetMemento()
    {
        return $this->memento;
    }
}
ログイン後にコピー

マネージャークラスとも呼ばれる担当者はメモを保存し、必要なときにここからメモを取り出します。保存のみを担当し、メモを変更することはできません。複雑なアプリケーションでは、プレイヤーが選択できる複数のアーカイブ レコードを選択的に表示できるゲームと同様に、これをリストにすることができます。

$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();
ログイン後にコピー

クライアント呼び出しで、発信者は状態を初期化して保存し、その後状態を人為的に変更しました。このときは担当者を通じてステータスを復元するだけで済みます。

端的に言えば、メモ モードは、外部クラス B に A の内部状態を保存させ、適切なタイミングでその状態を簡単に復元することです。
    #実際には、ブラウザのロールバック、データベースのバックアップと復元、オペレーティング システムのバックアップと復元、ドキュメントの取り消しとやり直し、チェスやカード ゲームの後悔など、メモ モードには多くの応用シナリオがあります。
  • このモードは、発信元のカプセル化を維持できます。つまり、これらの状態は外部オブジェクトから隠す必要があるため、記録するためにメモ オブジェクトにのみ渡すことができます
  • 状態のコピーの可能性発信者とメモの間でパフォーマンスの問題、特に大きなオブジェクトの複雑で多数の内部状態が発生するほか、一部の状態の欠落などのコーディングの抜け穴も発生します
  • Mac のタイムマシン機能 コンピュータを特定時点の状態に復元できることは誰もが知っています。実はWindowsのゴーストにも同様の機能があります。当社のモバイルオペレーティングシステムもそのような機能を開発することを決定しました。 [Time Machine バックアップ] をクリックすると、携帯電話上のすべての情報、データ、およびステータス情報が圧縮されて保存されます。ユーザーが許可した場合、ユーザーの携帯電話のメモリを占有することを避けるために、圧縮されたパッケージがクラウド サーバーにアップロードされます。それ以外の場合は、圧縮パッケージがクラウド サーバーにアップロードされます。ユーザーの携帯電話のメモリにのみ保存できます。ユーザーの携帯電話を特定の時点に復元する必要がある場合、すべてのタイムマシンのバックアップがリストされ、ユーザーはワンクリックで携帯電話のシステム状態をその時点の状態に復元できます。すごく便利ですね! !

#完全なコード: https://github.com/zhangyue0503/designpatterns-php/blob/master/17.memento/source/memento.php

##例

今回はテキスト メッセージを送信する例に戻ります。通常、テキスト メッセージや電子メールの送信などの機能を実行する場合、送信するコンテンツをデータベースまたはキャッシュから読み取って送信するキューが存在します。成功した場合は無視され、失敗した場合は、メッセージのステータスが表示されます。テキスト メッセージは失敗または再送信に変更されます。ここでは、直接前の未送信状態に戻し、次の送信キューが再度送信を行うのを待ちます。

SMS 送信クラス図

完全なソース コード: 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视频教程

以上がPHPのメモモードについて話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

今まで知らなかったことを後悔している 7 つの PHP 関数 今まで知らなかったことを後悔している 7 つの PHP 関数 Nov 13, 2024 am 09:42 AM

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? Apr 03, 2025 am 12:03 AM

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

See all articles