Einführung in Design Patterns – Template Method Pattern (PHP-Version)

WBOY
Freigeben: 2016-08-08 09:27:09
Original
918 Leute haben es durchsucht

Ein Witz besagt: Wie viele Schritte sind nötig, um einen Elefanten in den Kühlschrank zu legen?

1. Öffnen Sie den Kühlschrank

2. Legen Sie den Elefanten hinein

Schließen Sie den Kühlschrank

Ebenso dauert es wie viele Schritte?

1. Öffnen Sie den Kühlschrank

2. Stopfen Sie den Löwen hinein

Schließen Sie den Kühlschrank

Haben Sie das im obigen Beispiel bemerkt? zwei Beide Methoden haben gemeinsame Schritte, die spezifische Implementierung unterscheidet sich jedoch geringfügig. Kurz gesagt, diese beiden Verhaltenstypen können eine Schrittvorlage gemeinsam nutzen. Dies kann zu dem Designmuster führen, das dieses Mal besprochen wird – dem Template-Designmuster.

Das Prinzip des Vorlagenentwurfsmusters kann durch das UML-Klassendiagramm wie unten gezeigt dargestellt werden:

Spezifisches Codebeispiel:

LockAnimal .php

<?php
/**
 * 将动物锁进冰箱里抽象类
 * @author ben
 *
 */
abstract class LockAnimal{
    /**
     * 模板方法,使用final关键词防止子类覆盖
     */
   public final function lock(){
       $this->open();
       $this->push();
       $this->close();
   } 
   
   /**
    * 打开冰箱
    */
   abstract function open();
   
   /**
    * 将动物推进冰箱
    */
   abstract function push();
   
   /**
    * 关上冰箱
    */
   abstract function close();
}
Nach dem Login kopieren
LockElephant.php
<?php
/**
 * 将狮子锁进冰箱里
 * @author ben
 *
 */
require_once &#39;LockAnimal.php&#39;;
class LockElephant extends LockAnimal{
   
   /**
    * (non-PHPdoc)
    * @see LockAnimal::open()
    */
   public function open(){
       echo "in order to lock an elephant into a fridge, you need to open the fridge first<br />";
   }
   
   /**
    * (non-PHPdoc)
    * @see LockAnimal::push()
    */
   public function push(){
       echo "i'm pushing the elephant<br />";
   }
   
   /**
    * (non-PHPdoc)
    * @see LockAnimal::close()
    */
   public function close(){
       echo "finally, now i can close the fridge<br />";
   }
}
Nach dem Login kopieren
Nach dem Login kopieren
LockLion.php
<?php
/**
 * 将狮子锁进冰箱里
 * @author ben
 *
 */
require_once 'LockAnimal.php';
class LockLion extends LockAnimal{
   
   /**
    * (non-PHPdoc)
    * @see LockAnimal::open()
    */
   public function open(){
       echo "in order to lock an lion into a fridge, you need to open the fridge first<br />";
   }
   
   /**
    * (non-PHPdoc)
    * @see LockAnimal::push()
    */
   public function push(){
       echo "i'm pushing the lion<br />";
   }
   
   /**
    * (non-PHPdoc)
    * @see LockAnimal::close()
    */
   public function close(){
       echo "finally, now i can close the fridge<br />";
   }
}
Nach dem Login kopieren

Jetzt stellt sich die Frage, welches Unternehmen die beste Baggertechnologie hat? Nur ein Scherz. Manche Tiere sind wilder und werden nicht gehorsam in den Kühlschrank geschoben. Sie müssen unserem Programm einen Haken hinzufügen, um mit dieser Situation umzugehen. Der geänderte Code lautet wie folgt:

LockAnimal.php

<?php
/**
 * 将动物锁进冰箱里抽象类
 * @author ben
 *
 */
abstract class LockAnimal{
    /**
     * 模板方法,使用final关键词防止子类覆盖
     */
   public final function lock(){
       $this->open();
       if($this->needAnesthetic()){
           $this->anesthetic();
       }
       $this->push();
       $this->close();
   } 
   
   /**
    * 打开冰箱
    */
   abstract function open();
   
   /**
    * 是否需要麻醉
    */
   protected function needAnesthetic(){
       return false;
   }
   
   protected function anesthetic(){
       echo "anestheticing the animal";
   }
   
   /**
    * 将动物推进冰箱
    */
   abstract function push();
   
   /**
    * 关上冰箱
    */
   abstract function close();
}
Nach dem Login kopieren

LockElephant.php
<?php
/**
 * 将狮子锁进冰箱里
 * @author ben
 *
 */
require_once &#39;LockAnimal.php&#39;;
class LockElephant extends LockAnimal{
   
   /**
    * (non-PHPdoc)
    * @see LockAnimal::open()
    */
   public function open(){
       echo "in order to lock an elephant into a fridge, you need to open the fridge first<br />";
   }
   
   /**
    * (non-PHPdoc)
    * @see LockAnimal::push()
    */
   public function push(){
       echo "i'm pushing the elephant<br />";
   }
   
   /**
    * (non-PHPdoc)
    * @see LockAnimal::close()
    */
   public function close(){
       echo "finally, now i can close the fridge<br />";
   }
}
Nach dem Login kopieren
Nach dem Login kopieren
LockLion.php
<?php
/**
 * 将狮子锁进冰箱里
 * @author ben
 *
 */
require_once 'LockAnimal.php';
class LockLion extends LockAnimal{
   
   /**
    * (non-PHPdoc)
    * @see LockAnimal::open()
    */
   public function open(){
       echo "in order to lock an lion into a fridge, you need to open the fridge first<br />";
   }
   
   protected function needAnesthetic(){
       return true;
   }
   
   protected function anesthetic(){
       echo "anestheticing the lion<br />";
   }
   
   /**
    * (non-PHPdoc)
    * @see LockAnimal::push()
    */
   public function push(){
       echo "i'm pushing the lion<br />";
   }
   
   /**
    * (non-PHPdoc)
    * @see LockAnimal::close()
    */
   public function close(){
       echo "finally, now i can close the fridge<br />";
   }
}
Nach dem Login kopieren
index.php
<?php
require_once &#39;LockElephant.php&#39;;
require_once &#39;LockLion.php&#39;;

$elephant = new LockElephant();
$lion = new LockLion();

$elephant->lock();
$lion->lock();
Nach dem Login kopieren

Die offizielle Definition des Entwurfsmusters für Vorlagenmethoden lautet: Definieren Sie das Grundgerüst eines Algorithmus in einer Methode und verlagern Sie einige Schritte auf Unterklassen. Mithilfe von Vorlagenmethoden können Unterklassen bestimmte Schritte im Algorithmus neu definieren, ohne die Struktur des Algorithmus zu ändern.

Das Obige stellt die Einführung in Designmuster vor – Vorlagenmethodenmuster (PHP-Version), einschließlich der relevanten Inhalte. Ich hoffe, dass es für Freunde hilfreich ist, die sich für PHP-Tutorials interessieren.

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage