Dalam artikel sebelumnya "Apakah corak keadaan dalam PHP? Pelajari melalui contoh " Kami memperkenalkan corak keadaan dalam PHP. Artikel berikut akan membawa anda memahami corak pelawat dalam corak reka bentuk PHP.
Pelawat, sama seperti apabila kita melawat rumah orang lain, atau apabila seseorang datang ke rumah kita untuk melawat kita. Setiap daripada kita adalah seperti entiti, dan setiap orang yang melawat menyapa kita satu persatu. Lagipun, bangsa Cina kita adalah bangsa yang sangat mementingkan tatasusila dan layanan mesra. Pelawat adalah corak yang paling kompleks antara 23 corak reka bentuk GoF, dan ia juga merupakan corak yang diletakkan terakhir dalam pelbagai buku teks corak reka bentuk. Walau apa pun kesukarannya, mari kita lihat dulu definisi dan pelaksanaannya.
Takrifan GoF: Mewakili operasi yang bertindak pada setiap elemen dalam struktur objek. Ia membolehkan anda mentakrifkan operasi baharu yang bertindak pada setiap elemen tanpa mengubah kelasnya
Rajah Kelas GoF
Pelaksanaan kod
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; } }
Antara muka pelawat abstrak dan dua pelaksanaan konkrit. Ia boleh dianggap sebagai pasangan muda yang mengunjungi rumah kami!
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() { } }
Abstraksi dan pelaksanaan elemen juga boleh dianggap sebagai entiti untuk diakses. Sudah tentu saya dan isteri saya.
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); } } }
Ini ialah struktur objek yang digunakan untuk menyimpan entiti elemen dan membuat panggilan akses. Semua orang bertemu di ruang tamu dan bertukar salam Ini hanya ruang tamu
$o = new ObjectStructure(); $o->Attach(new ConcreteElementA()); $o->Attach(new ConcreteElementB()); $v1 = new ConcreteVisitor1(); $v2 = new ConcreteVisitor2(); $o->Accept($v1); $o->Accept($v2);
Panggilan pelanggan akhirnya membolehkan semua orang bertemu secara rasmi dan bersalaman. Satu lawatan selesai dengan gembira.
Akaun syarikat kami hanya mempunyai dua item (Elemen): pendapatan dan perbelanjaan, tetapi jabatan yang berbeza (Pelawat) akan menghasilkan kandungan yang berbeza . Sebagai contoh, apabila saya menyemak, saya hanya perlu menyemak data ringkasan bulanan atau suku tahunan Pengarah kewangan memerlukan rekod pendapatan dan perbelanjaan yang terperinci, dan akauntan memerlukan butiran lengkap semasa melakukan perakaunan. Dapat dilihat bahawa operasi syarikat benar-benar memerlukan pengetahuan yang sangat luas, bukan sahaja keupayaan pengurusan, tetapi juga pengetahuan perakaunan adalah kandungan yang mesti diketahui! !
Kod penuh: https://github.com/zhangyue0503/designpatterns-php/blob/master/23.visitor/source/visitor.php
Contoh terakhir corak adalah kembali kepada penghantaran mesej kami. Perkara yang sama berlaku untuk berbilang penyedia perkhidmatan Sebagai pelawat, mereka perlu menggunakan antara muka penghantaran SMS dan APP mereka sendiri. Pada masa ini, anda boleh menggunakan mod pelawat untuk mengendalikan dan merealisasikan semua operasi pelawat ini.
Penghantaran maklumat mod pelawat
Kod sumber penuh: 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);
Penerangan
Alamat asal: https://juejin.cn/post/6844903993240453133
Pengarang: Pengurus Projek Tegar
mengesyorkan pembelajaran: "Tutorial Video PHP"
Atas ialah kandungan terperinci Analisis mendalam tentang corak pelawat dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!