php设计模式之:装饰者模式

Beverage.php

<?php
namespace DesignPattern;

abstract class Beverage
{
    /**
     * @var string
     */
    protected $name = '';

    /**
     * @return string
     */
    public function getName(): string
    {
        return $this->name;
    }

    /**
     * @param string $name
     * @return Beverage
     */
    public function setName(string $name): Beverage
    {
        $this->name = $name;
        return $this;
    }

    /**
     * @return float
     */
    public abstract function getCost(): float;

    /**
     * Beverage constructor.
     */
    public function __construct()
    {
    }
}

BlueMountainCoffee.php

<?php

namespace DesignPattern;
/**
 * 蓝山咖啡
 */
class BlueMountainCoffee extends Beverage
{

    /**
     * @return float
     */
    public function getCost(): float
    {
        return 18.0;
    }
}

CubitaCoffee.php

<?php

namespace DesignPattern;
/**
 * 琥爵咖啡
 */
class CubitaCoffee extends Beverage
{

    /**
     * @return float
     */
    public function getCost(): float
    {
        return 24.0;
    }
}

CoffeeDecorator.php

<?php

namespace DesignPattern;

abstract class CoffeeDecorator extends Beverage
{
    /**
     * @var CoffeeDecorator
     */
    protected $coffeeDecorator;

    /**
     * CoffeeDecorator constructor.
     * @param Beverage $coffeeDecorator
     */
    public function __construct(Beverage $coffeeDecorator)//特别需要注意这个地方,装饰者模式必须允许对装饰后的对象再次装饰
    {
        parent::__construct();
        $this->coffeeDecorator = $coffeeDecorator;
    }
}

MilkDecorator.php

<?php

namespace DesignPattern;

class MilkDecorator extends CoffeeDecorator
{
    /**
     * @return float
     */
    public function getCost(): float
    {
        return $this->coffeeDecorator->getCost() + 2.5;
    }
}

SugarDecorator.php

<?php

namespace DesignPattern;

class SugarDecorator extends CoffeeDecorator
{

    /**
     * @return float
     */
    public function getCost(): float
    {
        return $this->coffeeDecorator->getCost() + 1.2;
    }
}

最终调用:

$coffee = new \DesignPattern\BlueMountainCoffee();//生成一杯蓝山咖啡
$beverage = new \DesignPattern\MilkDecorator($coffee);//给蓝山咖啡加一份牛奶
$beverage = new \DesignPattern\MilkDecorator($beverage);//给蓝山咖啡再加一份牛奶
$beverage = new \DesignPattern\SugarDecorator($beverage);//给蓝山咖啡加一份糖
$beverage = new \DesignPattern\SugarDecorator($beverage);//给蓝山咖啡再加一份糖
$beverage = new \DesignPattern\SugarDecorator($beverage);//给蓝山咖啡再加一份糖
var_dump($beverage->getCost());

程序运行结果:

float(26.6)

转载于:https://www.cnblogs.com/foolishnoob/p/9261219.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值