PHPテンプレートメソッドパターンの使い方を詳しく解説

php中世界最好的语言
リリース: 2023-03-26 09:30:01
オリジナル
5121 人が閲覧しました

今回は、PHP テンプレート メソッド パターンの使用について詳しく説明します。PHP テンプレート メソッド パターンを使用する際の 注意事項 は何ですか?実際の事例を見てみましょう。

テンプレートメソッドパターンとは

テンプレートメソッドデザインパターンは、抽象クラスの具象メソッドであるクラスメソッドtemplateMethod()を使用します。このメソッドの役割はソートです。重要なのは、テンプレート メソッドのパターンが操作のアルゴリズムの「骨格」を定義し、それが具体的なクラスによって実装されるということです。テンプレート メソッドを使用します

アルゴリズムのいくつかのステップが特定されているが、これらのステップはさまざまな方法で実装できる場合、アルゴリズムのステップが変更されていない場合は、テンプレート メソッドを使用してデバッグできます。ここでは、テンプレート メソッドの設計パターンを使用して、基本的な操作 (関数/メソッド) を抽象クラスに編成し、アプリケーションに必要なこれらの操作を実装できます。これは、コードの重複を避けるために、サブクラスの共通の動作を 1 つのクラスに配置する必要がある場合もあります。同じ大きな問題を解決するために複数のクラスを使用すると、すぐに重複したコードが発生する可能性があります。テンプレート メソッド パターン コントロール サブクラス拡張 (「フック」とも呼ばれます) を使用できます。

PHP プログラミングでは、よく問題に遭遇することがあります。このアルゴリズムは非常に単純です。 、画像を表示します。その後、テキストが画像の下に表示されます。

テンプレートの設計に参加するのは 2 人だけであるため、これは最も理解しやすいパターンの 1 つであり、templateMethod()、このメソッドは具象クラスによって実装されます

ここで重要なのは、テンプレート メソッドには具象メソッドと抽象メソッドの両方が含まれるためです。 、それらの操作は抽象です

2 つの抽象メソッドはそれぞれ addPicture と addTitile です。どちらの操作にも、それぞれ画像の URL 情報と画像タイトルを表すパラメーターが含まれています

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);
}
ログイン後にコピー

。 Concrete クラスtemplateMethod(),并由具体类实现这个方法.

抽象类

抽象类是这里的关键, 因为它同时包含具体和抽象方法. 模板方法往往是具体方法, 其操作是抽象的

两个抽象方法分别是addPicture和addTitile,这两个操作都包含一个参数, 分别表示图像的URL信息和图像标题.

Template.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 />";
  }
}
ログイン後にコピー

具体类

Concrete.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();
ログイン後にコピー

客户

Client.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();
}
ログイン後にコピー
ログイン後にコピー

$concrete变量实例化了Concrete, 但是它调用了display模板方法, 这是从父类继承的具体操作, 父类通过display()

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;;
  }
}
ログイン後にコピー
ログイン後にコピー

Customer

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);
ログイン後にコピー
ログイン後にコピー
$concrete 変数は Concrete をインスタンス化しますが、親クラスから継承された特定の操作である表示テンプレート メソッドを呼び出します。 display() を渡します。サブクラスの操作を呼び出します。

実行後の出力

画像のパスは次のとおりです:picture/chenqionghe.png

タイトル:chenqionghe はハンサムな男の子です

ご覧のとおり、顧客は画像のアドレスとタイトルを提供するだけで済みます

テンプレート メソッド設計パターンのフック

特定のケースでは、テンプレート メソッド関数に望ましくないステップが含まれる場合があります。この場合は、テンプレート メソッドのフックを使用できます。

テンプレート メソッドのデザイン パターンでは、メソッドをテンプレートの一部にするためにフックを使用できますが、このメソッドは言い換えれば、これはメソッドの一部ですが、例外を処理するためのフックが含まれています。この方法では、アルゴリズムによって確立された順序で実行されますが、オプションの要素を追加できます。テンプレート メソッドでは、テンプレート メソッドで期待されるアクションが完了しない可能性があります。このオプションの状況では、フックがこの問題に対する理想的な解決策です。

商品の合計金額が200元を超えた場合、送料12.95元が免除されます。🎜🎜🎜フックを作成する🎜🎜🎜テンプレートメソッドでフックを作成するのは非常に簡単です。興味深いことに、サブクラス化によりフックの動作を変更できますが、テンプレート 🎜🎜🎜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依赖倒置案例详解

以上がPHPテンプレートメソッドパターンの使い方を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!