1. 程式人生 > >B1:模板方法模式 TemplateMethod

B1:模板方法模式 TemplateMethod

用戶 ima trac fin this bstr str public emp

定義一個操作中的算法骨架,而將一些步驟延遲到子類中.模板方法使得子類可以不改變一個算法的結構即可重新定義該算法的某些特定步驟

UML:

技術分享


示例代碼:

所有的商品類在用戶購買前,都需要給用戶顯示出最終支付的費用.但有些商品需要納稅,有些商品可能有打折.

abstract class Product
{
    protected $payPrice = 0;
 
    public final function setAdjustment()
    {
        $this->payPrice += $this->discount();
        $this->payPrice += $this->tax();
    }
 
    public function getPayPrice()
    {
        return $this->payPrice;
    }
 
    protected function discount()
    {
        return 0;
    }
 
    abstract protected function tax();
}
 
class CD extends Product
{
    public function __construct($price)
    {
        $this->payPrice = $price;
    }
 
    protected function tax()
    {
        return 0;
    }
}
 
class IPhone extends Product
{
    public function __construct($price)
    {
        $this->payPrice = $price;
    }
 
    protected function tax()
    {
        return $this->payPrice * 0.2;
    }
 
    protected function discount()
    {
        return -10;
    }
 
}
 
$cd = new CD(15);
$cd->setAdjustment();
echo $cd->getPayPrice();
 
$iphone = new IPhone(6000);
$iphone->setAdjustment();
echo $iphone->getPayPrice();

  

ps:一般為防止模板下屬類修改模板,模板方法都會加上final

B1:模板方法模式 TemplateMethod