Design-Patterns

Decorator Pattern:

suppose you want to have burgers with your friends The burger cost you $4 //initial price with initial burger structure or basic price basic burger structure but you want to add some extra things like , cheese , sauce , meat etc here is a condition if you add extra addons then you have to pay extra charge for them This pattern is basically decorator design pattern It’s still a burger but it requires some extra price to decorate.


<?php

// interface  

// interface allows you to specify what methods a class should implement. 


interface FoodItem
{
    public function cost();
}


// This is our basic burger class 

class Burger implements FoodItem
{
    public function cost()
    {
        return 4;
    }
}

// Now decorate with cheese 

class Cheese implements FoodItem
{

    private $item; //private property item for Chess class

    public function __construct(FoodItem $item) //construct method for Chess class 
    {
        $this->item = $item; //this will set the value of item according to constructor paramenter
    }

    public function cost()
    {
        // $this->item ; //this line means item is a instance of a class setted by constructor
        // $this->item->cost() ;//targeting cost() method which is define in FoodItem Interface 
        // and implements by Burger Class for Basic Burger price
        // return $this->item->cost() ; //this line burger instance cost() method 
        return $this->item->cost() + 5; //now the value of burger instance is 4+5=9 from Cheese class instance 
    }
}


class Meat implements FoodItem{

    private $item ; 
    private $meatPrice = 8 ; 

    public function __construct(FoodItem $item)
    {
        $this->item = $item ; 
    }

    public function cost(){
        //burger instance cost + meat price 
        return $this->item->cost() + $this->meatPrice ; 
    }
}



$b = new Burger() ; //creating basic berger instance 
echo $b->cost() ; // getting value from cost() method in Burger class 
echo "\n" ; 
// $c = new Cheese() ; //Cheese class contruct demanding an argument 
$c = new Cheese($b) ; //now we are setting Burger class instance b as parameter
echo $c->cost(); // c->cost() will return Cheese class instance cost() method total cost of basic burger + cheese
echo "\n" ; 

$m = new Meat($b) ; 
echo $m->cost() ; 
echo "\n" ; 

$c_and_m = new Meat($c) ; 

echo $c_and_m->cost() ; 
echo "\n" ;