ホームページ  >  記事  >  バックエンド開発  >  PHP での訪問者パターンの詳細な分析

PHP での訪問者パターンの詳細な分析

青灯夜游
青灯夜游転載
2021-08-04 10:54:321989ブラウズ

前回の記事「PHPのステートモードとは?」例を通して学びましょう"PHP の状態パターンを紹介しました。次の記事では、PHP デザイン パターンにおける訪問者パターンを理解することができます。

PHP での訪問者パターンの詳細な分析

訪問者は、私たちが他の人の家を訪問するとき、または他の人が私たちを訪ねて家に来るときと同じです。私たち一人一人が一つの存在のようで、訪れる人は一人一人に挨拶をしてくれます。結局のところ、私たちの中華民族は礼儀とおもてなしを非常に重視する国民です。 Visitor は GoF の 23 種類のデザイン パターンの中で最も複雑なパターンであり、さまざまなデザイン パターンの教科書でも最後に掲載されているパターンです。難易度はともかく、まずはその定義と実装を見てみましょう。

Gof クラス図と説明

GoF 定義: オブジェクト構造内の各要素に作用する操作を表します。これにより、クラスを変更せずに各要素に作用する新しい操作を定義できます

#GoF クラス図

PHP での訪問者パターンの詳細な分析

#コード実装

interface Visitor
{
    public function VisitConcreteElementA(ConcreteElementA $a);
    function VisitConcreteElementB(ConcreteElementB $b);
}

class ConcreteVisitor1 implements Visitor
{
    public function VisitConcreteElementA(ConcreteElementA $a)
    {
        echo get_class($a) . "被" . get_class($this) . "访问", PHP_EOL;
    }
    public function VisitConcreteElementB(ConcreteElementB $b)
    {
        echo get_class($b) . "被" . get_class($this) . "访问", PHP_EOL;
    }
}

class ConcreteVisitor2 implements Visitor
{
    public function VisitConcreteElementA(ConcreteElementA $a)
    {
        echo get_class($a) . "被" . get_class($this) . "访问", PHP_EOL;
    }
    public function VisitConcreteElementB(ConcreteElementB $b)
    {
        echo get_class($b) . "被" . get_class($this) . "访问", PHP_EOL;
    }
}

抽象的な訪問者インターフェイスと 2 つの特定の実装。若いカップルが我が家を訪ねてきたと考えられます。

interface Element
{
    public function Accept(Visitor $v);
}

class ConcreteElementA implements Element
{
    public function Accept(Visitor $v)
    {
        $v->VisitConcreteElementA($this);
    }
    public function OperationA()
    {

    }
}

class ConcreteElementB implements Element
{
    public function Accept(Visitor $v)
    {
        $v->VisitConcreteElementB($this);
    }
    public function OperationB()
    {

    }
}

要素の抽象化と実装も、アクセス対象のエンティティとみなすことができます。もちろん私と妻です。

class ObjectStructure
{
    private $elements = [];

    public function Attach(Element $element)
    {
        $this->elements[] = $element;
    }

    public function Detach(Element $element)
    {
        $position = 0;
        foreach ($this->elements as $e) {
            if ($e == $element) {
                unset($this->elements[$position]);
                break;
            }
            $position++;
        }
    }

    public function Accept(Visitor $visitor)
    {
        foreach ($this->elements as $e) {
            $e->Accept($visitor);
        }
    }

}

これは、要素エンティティを保存し、アクセス呼び出しを行うために使用されるオブジェクト構造です。全員がリビング ルームに集まり、挨拶を交わしました。ここは単なるリビング ルームです。

$o = new ObjectStructure();
$o->Attach(new ConcreteElementA());
$o->Attach(new ConcreteElementB());

$v1 = new ConcreteVisitor1();
$v2 = new ConcreteVisitor2();

$o->Accept($v1);
$o->Accept($v2);

クライアントの呼びかけにより、ようやく全員が正式に集まり、お互いを紹介し、握手を交わすことができました。無事に1回の訪問が終わりました。

    訪問者が指定された要素を呼び出せるようにします。ここで、要素を呼び出す訪問者の動作は一般に固定されており、ほとんど変更されないことに注意してください。つまり、VisitConcreteElementA() と VisitConcreteElementB() の 2 つのメソッドです。つまり、オブジェクト構造を定義するクラスはめったに変更されませんが、この構造に対して新しい操作を定義する必要がある場合は、ビジター パターンが使用されます。
  • さまざまな無関係な処理を実行する必要があります。オブジェクト構造内のオブジェクトに対する操作。これらの操作によってこれらのオブジェクトのクラスが「汚染」されることを避けたい場合は、ビジター パターンが適しています。
  • ビジター パターンは、データ構造がそうでない状況に適しています。変化。そのため、通常は使用できないモードですが、必要な場合のみ使用することができます。 GoF: 「ほとんどの場合、訪問者モードは必要ありませんが、必要な場合には本当に必要になります。」データ構造が変わらない状況はほとんどないため、
  • 訪問者パターンの長所と短所: 新しい操作を追加するのが簡単、関連する操作を集中させ、無関係な操作を分離する、新しい ConcreteElement クラスを追加するのが難しい。クラスレベルでのアクセス; ステータスの蓄積; カプセル化の破棄
#当社のアカウントには収入と支出の 2 つの項目 (要素) しかありませんが、部門 (訪問者) が異なると、異なる内容が生成されます。たとえば、チェックする場合、月次や四半期ごとの集計データを確認するだけで済みますが、財務責任者は詳細な収入と支出の記録が必要であり、経理担当者は会計を行う際に完全な詳細が必要です。会社の運営には実に幅広い知識が求められ、経営能力だけでなく会計知識も必要であることがわかります! !

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

##例

パターンの最後の例はメッセージ送信に戻ります。複数のサービス プロバイダーにも同様のことが当てはまり、訪問者は独自の SMS 送信インターフェイスと APP プッシュ インターフェイスを使用する必要があります。このとき、訪問者モードを使用して、これらの訪問者のすべての操作を操作および実現できます。

ビジター モード情報の送信

完全なソース コード: https://github.com/zhangyue0503/designpatterns- php/blob/master/23.visitor/source/visitor-msg.phpPHP での訪問者パターンの詳細な分析

<?php

interface ServiceVisitor
{
    public function SendMsg(SendMessage $s);
    function PushMsg(PushMessage $p);
}

class AliYun implements ServiceVisitor
{
    public function SendMsg(SendMessage $s)
    {
        echo &#39;阿里云发送短信!&#39;, PHP_EOL;
    }
    public function PushMsg(PushMessage $p)
    {
        echo &#39;阿里云推送信息!&#39;, PHP_EOL;
    }
}

class JiGuang implements ServiceVisitor
{
    public function SendMsg(SendMessage $s)
    {
        echo &#39;极光发送短信!&#39;, PHP_EOL;
    }
    public function PushMsg(PushMessage $p)
    {
        echo &#39;极光推送短信!&#39;, PHP_EOL;
    }
}

interface Message
{
    public function Msg(ServiceVisitor $v);
}

class PushMessage implements Message
{
    public function Msg(ServiceVisitor $v)
    {
        echo &#39;推送脚本启动:&#39;;
        $v->PushMsg($this);
    }
}

class SendMessage implements Message
{
    public function Msg(ServiceVisitor $v)
    {
        echo &#39;短信脚本启动:&#39;;
        $v->SendMsg($this);
    }
}

class ObjectStructure
{
    private $elements = [];

    public function Attach(Message $element)
    {
        $this->elements[] = $element;
    }

    public function Detach(Message $element)
    {
        $position = 0;
        foreach ($this->elements as $e) {
            if ($e == $element) {
                unset($this->elements[$position]);
                break;
            }
            $position++;
        }
    }

    public function Accept(ServiceVisitor $visitor)
    {
        foreach ($this->elements as $e) {
            $e->Msg($visitor);
        }
    }

}

$o = new ObjectStructure();
$o->Attach(new PushMessage());
$o->Attach(new SendMessage());

$v1 = new AliYun();
$v2 = new JiGuang();

$o->Accept($v1);
$o->Accept($v2);

Description

SMS の送信とプッシュの送信を想定しています。これらは 2 つの変更されていない動作です。つまり、データ構造は安定していて変更されていません。

この方法で、ServiceVisitor を簡単に追加できます。Baidu Cloud または他の SMS プロバイダーを追加するときは、非常に簡単です。訪問者を便利に追加するだけです
  • ビジター モードは、安定したデータ構造を持つ構造に適しています。たとえば、請求書には収入と支出のみが記載されている、人々の性別は男性と女性のみなどです。
  • 元のアドレス: https://juejin.cn/post/6844903993240453133
著者: ハードコア プロジェクト マネージャー

は次の学習を推奨しています: 「

PHP ビデオ チュートリアル

以上がPHP での訪問者パターンの詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。