• 售前

  • 售后

热门帖子
入门百科

PHP计划模式之模板方法模式定义与用法详解

[复制链接]
心灰意冷437 显示全部楼层 发表于 2021-10-25 19:29:04 |阅读模式 打印 上一主题 下一主题
本文实例报告了PHP筹划模式之模板方法模式定义与用法。分享给各人供各人参考,详细如下:
什么是模板方法模式
模板方法(Template Method)筹划模式中利用了一个类方法templateMethod(), 该方法是抽象类中的一个详细方法, 这个方法的作用是对抽象方法序列排序,详细实现留给详细类来完成.关键在于模板方法模式定义了操作中算法的"骨架",而由详细类来实现.
什么时候利用模板方法
如果已经明确算法中的一些步调, 不过这些步调可以采用多种差异的方法实现, 就可以利用模板方法调试.如果算法中的步调稳定, 可以把这些步调留给子类详细实现.在这种情况下, 可以利用模板方法筹划模式来组织抽象类中的根本操作(函数/方法).然后由子类来实现应用所需的这些操作.
还有一种用法轻微复杂一些, 可能须要把子类共同的举动放在一个类中, 以制止代码重复.
如果利用多个类来解决同一个大型题目, 可能很快就会出现重复代码.
还有一点,可以利用模板方法模式控制子类扩展,也就是所谓的"钩子".
示例
在PHP编程中,可能常常会碰到一个题目: 要创建带图题的图像. 这个算法相称简单, 就是表现图像, 然后的图像下面表现文本.
由于模板筹划中只涉及两个参与者, 以是这是最容易明白的模式之一, 同时也非常有效. 抽象创建
  1. templateMethod()
复制代码
,并由详细类实现这个方法.
抽象类
抽象类是这里的关键, 由于它同时包含详细和抽象方法. 模板方法往往是详细方法, 其操作是抽象的
两个抽象方法分别是addPicture和addTitile,这两个操作都包含一个参数, 分别表现图像的URL信息和图像标题.
Template.php
  1. <?php
  2. abstract class Template
  3. {
  4.   protected $picture;
  5.   protected $title;
  6.   public function display($pictureNow, $titleNow)
  7.   {
  8.     $this->picture = $pictureNow;
  9.     $this->title = $titleNow;
  10.     $this->addPicture($this->picture);
  11.     $this->addTitle($this->title);
  12.   }
  13.   abstract protected function addPicture($picture);
  14.   abstract protected function addTitle($title);
  15. }
复制代码
详细类
Concrete.php
  1. <?php
  2. include_once('Template.php');
  3. class Concrete extends Template
  4. {
  5.   protected function addPicture($picture)
  6.   {
  7.     $this->picture = 'picture/' . $picture;
  8.     echo "图像路径为:" . $this->picture . '<br />';
  9.   }
  10.   protected function addTitle($title)
  11.   {
  12.     $this->title = $title;
  13.     echo "<em>标题: </em>" . $this->title . "<br />";
  14.   }
  15. }
复制代码
客户
Client.php
  1. <?php
  2. function __autoload($class_name)
  3. {
  4.   include $class_name . '.php';
  5. }
  6. class Client
  7. {
  8.   public function __construct()
  9.   {
  10.     $title = "chenqionghe is a handsome boy";
  11.     $concrete = new Concrete();
  12.     $concrete->display('chenqionghe.png', $title);
  13.   }
  14. }
  15. $worker = new Client();
复制代码
$concrete变量实例化了Concrete, 但是它调用了display模板方法, 这是从父类继承的详细操作, 父类通过
  1. display()
复制代码
调用子类的操作.
运行后输出
  1. 图像路径为:picture/chenqionghe.png
  2. 标题: chenqionghe is a handsome boy
复制代码
可以看到,客户只须要提供图像地址和标题
模板方法筹划模式中的钩子
有时模板方法函数可能有一个你不想要的步调, 某些特定情况下你可能不希望实验这个步调, 这时候就可以用到模板方法的钩子.
在模板方法筹划模式中, 利用钩子可以将一个方法作为模板的一部分,不过不肯定会用到这个方法, 换句话说, 它是方法的一部分,不过它包含一个钩子, 可以处置惩罚例外情况. 子类可以为算法增长一个可选元素, 这样一来, 尽管仍按模板方法创建的序次实验, 但有可能并不完成模板方法盼望的动作. 对于这种可选的情况, 钩子就是解决这个题目最抱负的工具.
示例
去网购商品, 登场8折, 如果总商品费用高出200元, 就免除12.95元钱运费.
创建钩子
在模板方法中创建钩子方法很故意思, 尽管子类可以改变钩子的举动, 但仍然要遵循模板中定义的序次
IHook.php
  1. <?php
  2. abstract class IHook
  3. {
  4.   protected $hook;
  5.   protected $fullCost;
  6.   public function templateMethod($fullCost, $hook)
  7.   {
  8.     $this->fullCost = $fullCost;
  9.     $this->hook = $hook;
  10.     $this->addGoods();
  11.     $this->addShippingHook();
  12.     $this->displayCost();
  13.   }
  14.   protected abstract function addGoods();
  15.   protected abstract function addShippingHook();
  16.   protected abstract function displayCost();
  17. }
复制代码
这里有3个抽象方法:
  1. addGoods()
复制代码
,
  1. addShippingHook()
复制代码
,
  1. displayCost()
复制代码
, 抽象类IHook实现的
  1. templateMethod()
复制代码
中确定了它们的序次. 在这里, 钩子方法放在中心, 现实上模板方法指定的序次中, 钩子可以放在任意位置. 模板方法须要两个参数, 一个是总泯灭, 另外还须要一个变量用来确定顾客是否免收运费.
实现钩子
一旦抽象类中创建了这些抽象方法, 并指定了它们实验的序次, 子类将实现全部这3个方法:
Concrete.php
  1. <?php
  2. class Concrete extends IHook
  3. {
  4.   protected function addGoods()
  5.   {
  6.     $this->fullCost = $this->fullCost * 0.8;
  7.   }
  8.   protected function addShippingHook()
  9.   {
  10.     if(!$this->hook)
  11.     {
  12.       $this->fullCost += 12.95;
  13.     }
  14.   }
  15.   protected function displayCost()
  16.   {
  17.     echo "您需要支付: " . $this->fullCost . '元<br />';
  18.   }
  19. }
复制代码
addGoods和displayCost都是尺度方法, 只有一个实现., 不过, addShippingHook的实现有所差异, 其中有一个条件来确定是否增长运费. 这就是钩子.
客户Client
Client.php
  1. <?php
  2. function __autoload($class_name)
  3. {
  4.   include $class_name . '.php';
  5. }
  6. class Client
  7. {
  8.   private $totalCost;
  9.   private $hook;
  10.   public function __construct($goodsTotal)
  11.   {
  12.     $this->totalCost = $goodsTotal;
  13.     $this->hook = $this->totalCost >= 200;
  14.     $concrete = new Concrete();
  15.     $concrete->templateMethod($this->totalCost, $this->hook);
  16.   }
  17. }
  18. $worker = new Client(100);
  19. $worker = new Client(200);
复制代码
该Client演示了分别购买100块钱和200块钱的商品最后的费用,运行效果如下
  1. 您需要支付: 92.95元
  2. 您需要支付: 160元
复制代码
更多关于PHP相关内容感爱好的读者可检察本站专题:《php面向对象程序筹划入门教程》、《PHP根本语法入门教程》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对各人PHP程序筹划有所帮助。

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作