<?php
//如果已有对象的部分内容或功能性发生改变,但是不需要修改原始对象的结构,那么使用装饰器设计模式最适合。
class CD{
    public $trackList;

    public function __construct(){
        $this->trackList = [];
    }

    public function addTrack($track){
        $this->trackList[] = $track;
    }

    public function getTrackList(){
        $output = '';
        foreach($this->trackList as $num => $track){
            $output .= ($num + 1). "){$track}.";
        }
        return $output;
    }
}

$tracksFromExternalSource = ['What It Means', 'Brr', 'Goodbye'];
$myCD = new CD();
foreach($tracksFromExternalSource as $track){
    $myCD->addTrack($track);
}

class CDTrackListDecoratorCaps{
    private $_cd;

    public function __construct($cd){
        $this->_cd = $cd;
    }

    public function makeCaps(){
        foreach ($this->_cd->trackList as $k => $track) {
            $this->_cd->trackList[$k] = strtoupper($track);
        }
    }
}

$myCDCaps = new CDTrackListDecoratorCaps($myCD);
$myCDCaps->makeCaps();

echo "The CD contains the following tracks:".$myCD->getTrackList();