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)
    
  • 相关阅读:
    HDU 4588 Count The Carries(找规律,模拟)
    HDU 4287 Intelligent IME(string,map,stl,make_pair)
    make_pair() (STL)
    HDU 4022 Bombing(stl,map,multiset,iterater遍历)
    hdu 2094 产生冠军(STL,set)
    zoj 2358,poj 1775 Sum of Factorials(数学题)
    浅谈this在普通函数里情况
    浅谈offset
    常见的一些属性操作
    明天就是七夕情人节了,还在为找对象的事而烦恼吗?单身的点进来看一看了啊,都是干货
  • 原文地址:https://www.cnblogs.com/foolishnoob/p/9261219.html
Copyright © 2011-2022 走看看