今回は、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('Template.php'); class Concrete extends Template { protected function addPicture($picture) { $this->picture = 'picture/' . $picture; echo "图像路径为:" . $this->picture . '<br />'; } protected function addTitle($title) { $this->title = $title; echo "<em>标题: </em>" . $this->title . "<br />"; } }
具体类
Concrete.php
<?php function autoload($class_name) { include $class_name . '.php'; } class Client { public function construct() { $title = "chenqionghe is a handsome boy"; $concrete = new Concrete(); $concrete->display('chenqionghe.png', $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()
<?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 . '元<br />'; } }
Customer
Client.php<?php
function autoload($class_name)
{
include $class_name . '.php';
}
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 . '元<br />'; } }
addGoods和displayCost都是标准方法, 只有一个实现., 不过, addShippingHook的实现有所不同, 其中有一个条件来确定是否增加运费. 这就是钩子.
客户Client
Client.php
<?php function autoload($class_name) { include $class_name . '.php'; } 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テンプレートメソッドパターンの使い方を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。