zoukankan      html  css  js  c++  java
  • 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 DesignPatternBlueMountainCoffee();//生成一杯蓝山咖啡
    $beverage = new DesignPatternMilkDecorator($coffee);//给蓝山咖啡加一份牛奶
    $beverage = new DesignPatternMilkDecorator($beverage);//给蓝山咖啡再加一份牛奶
    $beverage = new DesignPatternSugarDecorator($beverage);//给蓝山咖啡加一份糖
    $beverage = new DesignPatternSugarDecorator($beverage);//给蓝山咖啡再加一份糖
    $beverage = new DesignPatternSugarDecorator($beverage);//给蓝山咖啡再加一份糖
    var_dump($beverage->getCost());
    

    程序运行结果:

    float(26.6)
    
  • 相关阅读:
    SQL学习_WHERE 数据过滤
    SQL学习_SELECT
    读书笔记之_Win10 与Jmeter5.1.1界面兼容:
    appium+python搭建自动化测试框架_TestAPP框架(三)
    appium+python搭建自动化测试框架_Tools安装(一)
    总目录
    解决IntelliJ IDEA卡顿的方法
    SQL Server
    OBDC无法创建sql server连接
    常见问题
  • 原文地址:https://www.cnblogs.com/foolishnoob/p/9261219.html
Copyright © 2011-2022 走看看