前回の記事「PHPのステートモードとは?」例を通して学びましょう"PHP の状態パターンを紹介しました。次の記事では、PHP デザイン パターンにおける訪問者パターンを理解することができます。
訪問者は、私たちが他の人の家を訪問するとき、または他の人が私たちを訪ねて家に来るときと同じです。私たち一人一人が一つの存在のようで、訪れる人は一人一人に挨拶をしてくれます。結局のところ、私たちの中華民族は礼儀とおもてなしを非常に重視する国民です。 Visitor は GoF の 23 種類のデザイン パターンの中で最も複雑なパターンであり、さまざまなデザイン パターンの教科書でも最後に掲載されているパターンです。難易度はともかく、まずはその定義と実装を見てみましょう。
GoF 定義: オブジェクト構造内の各要素に作用する操作を表します。これにより、クラスを変更せずに各要素に作用する新しい操作を定義できます
#GoF クラス図
#コード実装
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回の訪問が終わりました。
#完全なコード: https://github.com/zhangyue0503/designpatterns-php/blob/master/23.visitor/source/visitor.php
##例
完全なソース コード: https://github.com/zhangyue0503/designpatterns- php/blob/master/23.visitor/source/visitor-msg.php
<?php interface ServiceVisitor { public function SendMsg(SendMessage $s); function PushMsg(PushMessage $p); } class AliYun implements ServiceVisitor { public function SendMsg(SendMessage $s) { echo '阿里云发送短信!', PHP_EOL; } public function PushMsg(PushMessage $p) { echo '阿里云推送信息!', PHP_EOL; } } class JiGuang implements ServiceVisitor { public function SendMsg(SendMessage $s) { echo '极光发送短信!', PHP_EOL; } public function PushMsg(PushMessage $p) { echo '极光推送短信!', PHP_EOL; } } interface Message { public function Msg(ServiceVisitor $v); } class PushMessage implements Message { public function Msg(ServiceVisitor $v) { echo '推送脚本启动:'; $v->PushMsg($this); } } class SendMessage implements Message { public function Msg(ServiceVisitor $v) { echo '短信脚本启动:'; $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 プロバイダーを追加するときは、非常に簡単です。訪問者を便利に追加するだけですは次の学習を推奨しています: 「PHP ビデオ チュートリアル
」
以上がPHP での訪問者パターンの詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。