Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Analisis mendalam tentang corak pelawat dalam PHP

Analisis mendalam tentang corak pelawat dalam PHP

青灯夜游
青灯夜游ke hadapan
2021-08-04 10:54:322058semak imbas

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.

Analisis mendalam tentang corak pelawat dalam 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.

Rajah kelas Gof dan penjelasan

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

Analisis mendalam tentang corak pelawat dalam PHP

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.

  • Biarkan pelawat memanggil elemen yang dinyatakan. Perlu diingatkan di sini bahawa tingkah laku pelawat yang memanggil elemen secara amnya tetap dan jarang berubah. Iaitu, dua kaedah VisitConcreteElementA() dan VisitConcreteElementB(). Maksudnya, kelas yang mentakrifkan struktur objek jarang berubah, tetapi apabila selalunya perlu untuk mentakrifkan operasi baharu pada struktur ini, corak pelawat
  • perlu dilakukan pada banyak objek yang berbeza dan tidak berkaitan dalam struktur objek. Apabila anda ingin mengelakkan operasi ini "mencemarkan" kelas objek ini, corak pelawat sesuai
  • Corak pelawat sesuai untuk situasi di mana struktur data tidak berubah. Oleh itu, ia adalah mod yang anda tidak boleh gunakan seperti biasa, tetapi anda hanya boleh menggunakan mod ini apabila diperlukan. GoF: "Kebanyakan masa anda tidak memerlukan mod pelawat, tetapi apabila anda melakukannya, anda benar-benar memerlukannya." Kerana terdapat beberapa situasi di mana struktur data tidak berubah
  • Beberapa kelebihan dan kekurangan corak pelawat: mudah untuk menambah operasi yang berkaitan dengan menumpukan dan memisahkan operasi yang tidak berkaitan adalah sukar untuk menambah kelas ConcreteElement baharu; melalui Akses di peringkat kelas; mengumpul status; memusnahkan enkapsulasi

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

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

Analisis mendalam tentang corak pelawat dalam PHP

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 &#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);

Penerangan

  • Kami menganggap bahawa menghantar SMS dan Menghantar mesej tolak ialah dua gelagat yang berterusan, iaitu, struktur data mereka adalah stabil dan tidak berubah
  • Dengan cara ini kita boleh menambah ServiceVisitor dengan mudah Apabila menambahkan Baidu Cloud atau penyedia SMS lain, Sangat mudah untuk menambah pelawat
  • Mod pelawat lebih sesuai untuk struktur dengan struktur data yang stabil. Sebagai contoh, bil hanya mempunyai pendapatan dan perbelanjaan, jantina orang hanya lelaki dan perempuan, dll.

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!

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