Problèmes résolus par le modèle de visiteur
Dans notre processus d'écriture de code, nous devons souvent ajouter du code à certains objets similaires. Prenons comme exemple le composant d'impression d'un objet informatique. :
/** * 抽象基类 */ abstract class Unit { /** *获取名称 */ abstract public function getName(); } /** * Cpu类 */ class Cpu extends Unit { public function getName() { return 'i am cpu'; } } /** * 内存类 */ class Memory extends Unit { public function getName() { return 'i am memory'; } } /** * 键盘类 */ class Keyboard extends Unit { public function getName() { return 'i am keyboard'; } } /** * 计算机类 */ class Computer { protected $_items = []; public function add(Unit $unit) { $this->_items[] = $unit; } public function print() { // 循环打印各个组成部分 foreach ($this->_items as $item) { $item->getName(); } } }
Pour le moment, le code ci-dessus semble parfait, mais voici le problème. Maintenant, nous devons non seulement imprimer les composants, mais également enregistrer chaque composant dans la base de données. seulement cela, mais il faut aussi imprimer le prix de chaque composant ; si vous ajoutez les méthodes getPrice() et save() à la classe de base Unit à ce moment-là, nous pouvons également réaliser les fonctions que nous voulons, mais cela pose également des problèmes. . Vous ne savez pas quelles opérations supplémentaires doivent être ajoutées, si chaque nouvelle opération est ajoutée de cette manière, notre classe deviendra de plus en plus gonflée.
Mise en œuvre du modèle de visiteur
Le modèle de visiteur vise à résoudre ce problème. Il découple le couplage entre la structure de données et les opérations qui agissent sur la structure. Cela permet l'ensemble des opérations. pour évoluer relativement librement. Jetons un coup d'œil au code amélioré suivant :
/** * 抽象基类 */ abstract class Unit { /** * 获取名称 */ abstract public function getName(); /** * 用来接受访问者对象,回调访问者的visit方法 * 非常关键的方法 */ public function accept(Visitor $visitor) { $method = visit . get_class($this); if (method_exists($visitor, $method)) { $visitor->$method($this); } } } /** * Cpu类 */ class Cpu extends Unit { public function getName() { return 'i am cpu'; } } /** * Memory类 */ class Memory extends Unit { public function getName() { return 'i am memory'; } } /** * Keyboard类 */ class Keyboard extends Unit { public function getName() { return 'i am keyboard'; } } /** * Keyboard类 */ interface Visitor { public function visitCpu(Cpu $cpu); public function visitMemory(Memory $memory); public function visitKeyboard(Keyboard $keyboard); } /** * */ class PrintVisitor implements Visitor { public function visitCpu(Cpu $cpu) { echo "hello, " . $cpu->getName() . "\n"; } public function visitMemory(Memory $memory) { echo "hello, " . $memory->getName() . "\n"; } public function visitKeyboard(Keyboard $keyboard) { echo "hello, " . $keyboard->getName() . "\n"; } } /** * */ class Computer { protected $_items = []; public function add(Unit $unit) { $this->_items[] = $unit; } /** * 调用各个组件的accept方法 */ public function accept(Visitor $visitor) { foreach ($this->_items as $item) { $item->accept($visitor); } } } $computer = new Computer(); $computer->add(new Cpu()); $computer->add(new Memory()); $computer->add(new Keyboard()); $printVisitor = new PrintVisitor(); $computer->print($printVisitor); // 以上的代码将打印出 hello, i am cpu hello, i am memory hello, i am keyboard
Résumé
Après les améliorations ci-dessus, il nous devient très facile d'évoluer. Si nous devons ajouter une nouvelle méthode de sauvegarde à la base de données, nous pouvons ajouter une nouvelle classe qui implémente Visitor, telle que SaveVisitor. Implémenter la méthode save dans cette classe équivaut à décomposer cette classe et certaines opérations dans cette classe. , et l'objet qui collecte les opérations de classe est le visiteur.
Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'apprentissage de chacun. J'espère également que tout le monde soutiendra le site Web PHP chinois.
Pour plus d'articles sur la maîtrise facile du mode visiteur des modèles de conception PHP, veuillez faire attention au site Web PHP chinois !