Heim  >  Artikel  >  Backend-Entwicklung  >  Beherrschen Sie ganz einfach den Besuchermodus des PHP-Designmusters

Beherrschen Sie ganz einfach den Besuchermodus des PHP-Designmusters

高洛峰
高洛峰Original
2016-12-21 16:11:47902Durchsuche

Durch das Besuchermuster gelöste Probleme

Bei unserem Code-Schreibprozess müssen wir häufig Code zu einigen ähnlichen Objekten hinzufügen. Als nächstes nehmen wir die Druckkomponente eines Computerobjekts :

/**
* 抽象基类
*/
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();
    }
  }
}

Zu diesem Zeitpunkt scheint der obige Code perfekt zu sein, aber hier kommt das Problem. Jetzt müssen wir nicht nur die Komponenten drucken, sondern auch jede Komponente in der Datenbank speichern Nur das, aber wir müssen auch den Preis jeder Komponente drucken. Wenn Sie zu diesem Zeitpunkt die Methoden getPrice () und save () zur Unit-Basisklasse hinzufügen, können wir auch die gewünschten Funktionen erreichen, aber es gibt auch Probleme damit Sie wissen nicht, welche zusätzlichen Operationen hinzugefügt werden müssen. Wenn jede neue Operation auf diese Weise hinzugefügt wird, wird unsere Klasse immer aufgeblähter.

Implementierung des Besuchermusters

Das Besuchermuster soll dieses Problem lösen. Es entkoppelt die Kopplung zwischen der Datenstruktur und den Operationen, die auf die Struktur einwirken Schauen wir uns den folgenden verbesserten Code an:

/**
* 抽象基类
*/
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

Zusammenfassung

Nach den oben genannten Verbesserungen wird es für uns sehr einfach, ihn zu erweitern. Wenn wir der Datenbank eine neue Methode zum Speichern hinzufügen müssen, können wir eine neue Klasse hinzufügen, die Visitor implementiert, z. B. SaveVisitor. Die Implementierung der Speichermethode in dieser Klasse entspricht der Zerlegung dieser Klasse und einiger Vorgänge in dieser Klasse , und das Objekt, das Klassenoperationen sammelt, ist der Besucher.

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er zum Lernen aller beiträgt. Ich hoffe auch, dass jeder die PHP-Chinesisch-Website unterstützt.

Weitere Artikel zum einfachen Beherrschen des Besuchermodus von PHP-Designmustern finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn