PHP设计模式访问者模式
PHP设计模式——访问者模式
访问者模式表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。
UML类图:
角色:
1.抽象访问者(State):为该对象结构中具体元素角色声明一个访问操作接口。该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色,这样访问者就可以通过该元素角色的特定接口直接访问它。
2.具体访问者(Success):实现访问者声明的接口。
3.抽象元素(Person):定义一个接受访问操作accept(),它以一个访问者作为参数。
4. 具体元素(Man):实现了抽象元素所定义的接受操作接口。
5.结构对象(ObjectStruct):这是使用访问者模式必备的角色。它具备以下特性:能枚举它的元素;可以提供一个高层接口以允许访问者访问它的元素;如有需要,可以设计成一个复合对象或者一个聚集(如一个列表或无序集合)。
核心代码:
<span style="color:#000000;"><!--?php /** * Created by PhpStorm. * User:Jang * Date:2015/6/11 * Tim: 9 :40 */ /*男人这本书的内容要比封面吸引人;女人这本书的封面通常比内容更吸引人 男人成功时,背后多半有一个伟大的女人;女人成功时,背后多半有一个失败的男人 男人失败时,闷头喝酒,谁也不用劝;女人失败时,眼泪汪汪,谁也劝不了 男人恋爱时,凡事不懂也要装懂;女人恋爱时,遇事懂也要装作不懂*/ //抽象状态 abstract class State { protected $state_name; //得到男人反应 public abstract function GetManAction(VMan $elementM); //得到女人反应 public abstract function GetWomanAction(VWoman $elementW); } //抽象人 abstract class Person { public $type_name; public abstract function Accept(State $visitor); } //成功状态 class Success extends State { public function __construct() { $this--->state_name=成功; } public function GetManAction(VMan $elementM) { echo {$elementM->type_name}:{$this->state_name}时,背后多半有一个伟大的女人。 ; } public function GetWomanAction(VWoman $elementW) { echo {$elementW->type_name} :{$this->state_name}时,背后大多有一个不成功的男人。 ; } } //失败状态 class Failure extends State { public function __construct() { $this->state_name=失败; } public function GetManAction(VMan $elementM) { echo {$elementM->type_name}:{$this->state_name}时,闷头喝酒,谁也不用劝。 ; } public function GetWomanAction(VWoman $elementW) { echo {$elementW->type_name} :{$this->state_name}时,眼泪汪汪,谁也劝不了。 ; } } //恋爱状态 class Amativeness extends State { public function __construct() { $this->state_name=恋爱; } public function GetManAction(VMan $elementM) { echo {$elementM->type_name}:{$this->state_name}时,凡事不懂也要装懂。 ; } public function GetWomanAction(VWoman $elementW) { echo {$elementW->type_name} :{$this->state_name}时,遇事懂也要装作不懂。 ; } } //男人 class VMan extends Person { function __construct() { $this->type_name=男人; } public function Accept(State $visitor) { $visitor->GetManAction($this); } } //女人 class VWoman extends Person { public function __construct() { $this->type_name=女人; } public function Accept(State $visitor) { $visitor->GetWomanAction($this); } } //对象结构 class ObjectStruct { private $elements=array(); //增加 public function Add(Person $element) { array_push($this->elements,$element); } //移除 public function Remove(Person $element) { foreach($this->elements as $k=>$v) { if($v==$element) { unset($this->elements[$k]); } } } //查看显示 public function Display(State $visitor) { foreach ($this->elements as $v) { $v->Accept($visitor); } } }</span>
测试客户端代码:
header(Content-Type:text/html;charset=utf-8); //------------------------访问者模式-------------------- require_once ./Visitor/Visitor.php; $os = new ObjectStruct(); $os->Add(new VMan()); $os->Add(new VWoman()); //成功时反应 $ss = new Success(); $os->Display($ss); //失败时反应 $fs = new Failure(); $os->Display($fs); //恋爱时反应 $ats=new Amativeness(); $os->Display($ats);
适用场景及优势:
1) 一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作。
2) 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而你想避免让这些操作“污染”这些对象的类。Visitor模式使得你可以将相关的操作集中起来定义在一个类中。
3) 当该对象结构被很多应用共享时,用Visitor模式让每个应用仅包含需要用到的操作。
4) 定义对象结构的类很少改变,但经常需要在此结构上定义新的操作。改变对象结构类需要重定义对所有访问者的接口,这可能需要很大的代价。如果对象结构类经常改变,那么可能还是在这些类中定义这些操作较好。

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas











Dalam rangka kerja Java, perbezaan antara corak reka bentuk dan corak seni bina ialah corak reka bentuk mentakrifkan penyelesaian abstrak kepada masalah biasa dalam reka bentuk perisian, memfokuskan pada interaksi antara kelas dan objek, seperti corak kilang. Corak seni bina mentakrifkan hubungan antara struktur sistem dan modul, memfokuskan pada organisasi dan interaksi komponen sistem, seperti seni bina berlapis.

Corak penghias ialah corak reka bentuk struktur yang membolehkan penambahan dinamik fungsi objek tanpa mengubahsuai kelas asal. Ia dilaksanakan melalui kerjasama komponen abstrak, komponen konkrit, penghias abstrak dan penghias konkrit, dan boleh mengembangkan fungsi kelas secara fleksibel untuk memenuhi keperluan yang berubah-ubah. Dalam contoh ini, penghias susu dan mocha ditambahkan pada Espresso untuk jumlah harga $2.29, menunjukkan kuasa corak penghias dalam mengubah suai gelagat objek secara dinamik.

1. Corak kilang: Asingkan penciptaan objek dan logik perniagaan, dan cipta objek jenis tertentu melalui kelas kilang. 2. Corak pemerhati: membenarkan objek subjek memberitahu objek pemerhati tentang perubahan keadaan mereka, mencapai gandingan longgar dan corak pemerhati.

Corak reka bentuk menyelesaikan cabaran penyelenggaraan kod dengan menyediakan penyelesaian yang boleh digunakan semula dan boleh diperluas: Corak Pemerhati: Membenarkan objek melanggan acara dan menerima pemberitahuan apabila ia berlaku. Corak Kilang: Menyediakan cara terpusat untuk mencipta objek tanpa bergantung pada kelas konkrit. Corak Singleton: memastikan bahawa kelas hanya mempunyai satu contoh, yang digunakan untuk mencipta objek yang boleh diakses secara global.

TDD digunakan untuk menulis kod PHP berkualiti tinggi Langkah-langkahnya termasuk: menulis kes ujian, menerangkan fungsi yang diharapkan dan menjadikannya gagal. Tulis kod supaya hanya kes ujian lulus tanpa pengoptimuman yang berlebihan atau reka bentuk terperinci. Selepas kes ujian lulus, optimumkan dan faktorkan semula kod untuk meningkatkan kebolehbacaan, kebolehselenggaraan dan kebolehskalaan.

Rangka kerja Guice menggunakan beberapa corak reka bentuk, termasuk: Corak Singleton: memastikan kelas hanya mempunyai satu tika melalui anotasi @Singleton. Corak kaedah kilang: Cipta kaedah kilang melalui anotasi @Provides dan dapatkan contoh objek semasa suntikan pergantungan. Mod strategi: Bungkus algoritma ke dalam kelas strategi yang berbeza dan nyatakan strategi khusus melalui anotasi @Named.

Corak Penyesuai ialah corak reka bentuk struktur yang membolehkan objek yang tidak serasi berfungsi bersama Ia menukar satu antara muka kepada yang lain supaya objek boleh berinteraksi dengan lancar. Penyesuai objek melaksanakan corak penyesuai dengan mencipta objek penyesuai yang mengandungi objek yang disesuaikan dan melaksanakan antara muka sasaran. Dalam kes praktikal, melalui mod penyesuai, pelanggan (seperti MediaPlayer) boleh memainkan media format lanjutan (seperti VLC), walaupun ia sendiri hanya menyokong format media biasa (seperti MP3).

Rangka kerja SpringMVC menggunakan corak reka bentuk berikut: 1. Mod Singleton: mengurus bekas Spring 2. Mod fasad: koordinat pengawal, paparan dan interaksi model 3. Mod strategi: memilih pengendali permintaan berdasarkan permintaan; : menerbitkan dan mendengar acara aplikasi. Corak reka bentuk ini meningkatkan fungsi dan fleksibiliti SpringMVC, membolehkan pembangun mencipta aplikasi yang cekap dan boleh diselenggara.
