Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung der Verwendung des PHP-Vorlagenmethodenmusters

Detaillierte Erläuterung der Verwendung des PHP-Vorlagenmethodenmusters

php中世界最好的语言
php中世界最好的语言Original
2018-05-17 11:50:445063Durchsuche

Dieses Mal werde ich Ihnen eine detaillierte Erklärung der Verwendung des PHP-Vorlagenmethodenmusters geben. Was sind die Vorsichtsmaßnahmen bei der Verwendung des PHP-Vorlagenmethodenmusters? sehen.

Was ist ein Vorlagenmethodenmuster?

Vorlagenmethode (Vorlagenmethode)Entwurfsmuster A Die Klassenmethode templateMethod() ist eine konkrete Methode in einer abstrakten Klasse. Die Funktion dieser Methode besteht darin, die Reihenfolge der abstrakten Methoden zu sortieren, und die spezifische Implementierung wird der konkreten Klasse überlassen Muster definiert den Algorithmus in der Operation.

Wann werden Vorlagenmethoden verwendet?

Wenn einige Schritte im Algorithmus wurden geklärt. Diese Schritte können jedoch auf viele verschiedene Arten implementiert werden, und Sie können die Vorlagenmethode zum Debuggen verwenden. Wenn die Schritte im Algorithmus unverändert bleiben, können Sie diese Schritte der Unterklasse zur spezifischen Implementierung überlassen. In diesem Fall können Sie die Vorlagenmethode verwenden, um die grundlegenden Operationen (Funktionen/Methoden) in der abstrakten Klasse zu organisieren. Dann implementieren die Unterklassen diese von der Anwendung benötigten Operationen Die Verwendung ist etwas komplizierter, und Sie müssen möglicherweise die allgemeinen Verhaltensweisen der Unterklassen in einer Klasse zusammenfassen, um Codeduplizierung zu vermeiden.

Wenn Sie mehrere Klassen verwenden, um dasselbe große Problem zu lösen, kann es schnell zu doppeltem Code kommen erscheinen.

Eine weitere Sache: Sie können Vorlagen verwenden. Das Methodenmuster steuert die Unterklassenerweiterung, den sogenannten „Hook“.

Beispiel

Bei der PHP-Programmierung kann es häufig zu Problemen kommen: Das Erstellen eines Bandbilds für den Bildtitel ist recht einfach. Er besteht darin, das Bild anzuzeigen und dann den Text unter dem Bild anzuzeigen.

Da nur zwei Teilnehmer am Vorlagenentwurf beteiligt sind, ist dies eines der am einfachsten zu verstehenden und gleichzeitig sehr nützlichen Abstraktions-Builds, und diese Methode wird von einer konkreten Klasse implementiert 🎜>

Abstrakte Klasse

templateMethod()

Abstrakte Klasse ist hier der Schlüssel, da sie auch konkrete und abstrakte Methoden enthält. Vorlagenmethoden sind oft konkrete Methoden und ihre Operationen sind abstrakt

Die beiden abstrakten Methoden sind addPicture und addTitile. Beide Operationen enthalten einen Parameter, der die URL-Informationen bzw. den Bildtitel des Bildes darstellt.

Template.php

<?php
abstract class Template
{
  protected $picture;
  protected $title;
  public function display($pictureNow, $titleNow)
  {
    $this->picture = $pictureNow;
    $this->title = $titleNow;
    $this->addPicture($this->picture);
    $this->addTitle($this->title);
  }
  abstract protected function addPicture($picture);
  abstract protected function addTitle($title);
}

Betonklasse

Concrete.php

<?php
include_once(&#39;Template.php&#39;);
class Concrete extends Template
{
  protected function addPicture($picture)
  {
    $this->picture = &#39;picture/&#39; . $picture;
    echo "图像路径为:" . $this->picture . &#39;<br />&#39;;
  }
  protected function addTitle($title)
  {
    $this->title = $title;
    echo "<em>标题: </em>" . $this->title . "<br />";
  }
}

Client

Client.php

<?php
function autoload($class_name)
{
  include $class_name . &#39;.php&#39;;
}
class Client
{
  public function construct()
  {
    $title = "chenqionghe is a handsome boy";
    $concrete = new Concrete();
    $concrete->display(&#39;chenqionghe.png&#39;, $title);
  }
}
$worker = new Client();

$concrete-Variable instanziiert Concrete, ruft jedoch die Anzeigevorlagenmethode auf, die von der übergeordneten Klasse geerbt wird. Die übergeordnete Klasse ruft die Operationen der Unterklasse über

auf Nach dem Ausführen lautet die Ausgabe

Der Bildpfad lautet: picture/chenqionghe.pngdisplay()Titel: Chenqionghe ist ein hübscher Junge

Wie Sie sehen können , der Kunde muss nur die Bildadresse und den Titel angeben


Hängen Sie das Designmuster der Vorlagenmethode ein

Manchmal kann die Funktion der Vorlagenmethode vorhanden sein Ein Schritt, den Sie nicht möchten. In bestimmten Fällen möchten Sie diesen Schritt möglicherweise nicht ausführen. In diesem Fall können Sie den Vorlagenmethoden-Hook verwenden.Im Vorlagenmethoden-Entwurfsmuster können Sie dies tun Verwenden Sie Hooks, um eine Methode zu einem Teil der Vorlage zu machen. Mit anderen Worten: Sie ist Teil der Methode, enthält jedoch einen Hook, der Ausnahmen verarbeiten kann Auf diese Weise werden die von der Vorlagenmethode erwarteten Aktionen möglicherweise nicht ausgeführt, obwohl sie immer noch in der von der Vorlagenmethode festgelegten Reihenfolge ausgeführt werden.

Beispiel

Gehen Sie online einkaufen und erhalten Sie 20 % Rabatt. Wenn die Gesamtkosten des Produkts 200 Yuan übersteigen, entfällt die Versandkostenpauschale von 12,95 Yuan.

Hooks einrichten

Es ist interessant, Hook-Methoden in Template-Methoden zu etablieren. Obwohl Unterklassen das Verhalten von Hooks ändern können, müssen sie dennoch der in der Vorlage definierten Reihenfolge folgen.

IHook.php

<?php
abstract class IHook
{
  protected $hook;
  protected $fullCost;
  public function templateMethod($fullCost, $hook)
  {
    $this->fullCost = $fullCost;
    $this->hook = $hook;
    $this->addGoods();
    $this->addShippingHook();
    $this->displayCost();
  }
  protected abstract function addGoods();
  protected abstract function addShippingHook();
  protected abstract function displayCost();
}

这里有3个抽象方法: addGoods(), addShippingHook(),displayCost(), 抽象类IHook实现的templateMethod()中确定了它们的顺序. 在这里, 钩子方法放在中间, 实际上模板方法指定的顺序中, 钩子可以放在任意位置. 模板方法需要两个参数, 一个是总花费, 另外还需要一个变量用来确定顾客是否免收运费.

实现钩子

一旦抽象类中建立了这些抽象方法, 并指定了它们执行的顺序, 子类将实现所有这3个方法:

Concrete.php

<?php
class Concrete extends IHook
{
  protected function addGoods()
  {
    $this->fullCost = $this->fullCost * 0.8;
  }
  protected function addShippingHook()
  {
    if(!$this->hook)
    {
      $this->fullCost += 12.95;
    }
  }
  protected function displayCost()
  {
    echo "您需要支付: " . $this->fullCost . &#39;元<br />&#39;;
  }
}

addGoods和displayCost都是标准方法, 只有一个实现., 不过, addShippingHook的实现有所不同, 其中有一个条件来确定是否增加运费. 这就是钩子.

客户Client

Client.php

<?php
function autoload($class_name)
{
  include $class_name . &#39;.php&#39;;
}
class Client
{
  private $totalCost;
  private $hook;
  public function construct($goodsTotal)
  {
    $this->totalCost = $goodsTotal;
    $this->hook = $this->totalCost >= 200;
    $concrete = new Concrete();
    $concrete->templateMethod($this->totalCost, $this->hook);
  }
}
$worker = new Client(100);
$worker = new Client(200);

该Client演示了分别购买100块钱和200块钱的商品最后的费用,运行结果如下

您需要支付: 92.95元
您需要支付: 160元

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

PHP接口隔离原则(ISP)使用案例解析

PHP依赖倒置案例详解

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Verwendung des PHP-Vorlagenmethodenmusters. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen 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