<?php
//通过在必需的逻辑和方法的集合前创建简单的外观接口,外观设计模式隐藏了来自调用对象的复杂性。
class CD{
    public $tracks = [];
    public $band = '';
    public $title = '';

    public function __construct($title, $band, $tracks){
        $this->title = $title;
        $this->band = $band;
        $this->tracks = $tracks;
    }
}

$title = 'Waste of a Rib';
$band = 'Never Again';
$tracksFromExternalSource = ['What It Means', 'Brrr', 'Goodbye'];
$cd = new CD($title, $band, $tracksFromExternalSource);

class CDUpperCase{
    public static function makeString($cd, $type){
        $cd->$type = strtoupper($cd->$type);
    }

    public static function makeArray($cd, $type){
        $cd->type = array_map('strtoupper', $cd->$type);
    }
}

class CDMakeXML{
    public static function create($cd){
        $doc = new DOMDocument();

        $root = $doc->createElement('CD');
        $root = $doc->appendChild($root);

        $title = $doc->createElement('TITLE', $cd->title);
        $root->appendChild($title);

        $band = $doc->createElement('BAND', $cd->band);
        $root->appendChild($band);

        $tracks = $doc->createElement('TRACKS');
        $tracks = $root->appendChild($tracks);

        foreach($cd->tracks as $track){
            $track = $doc->createElement('TRACK', $track);
            $track = $tracks->appendChild($track);
        }
        return $doc->saveXML();
    }
}

//CDUpperCase::makeString($cd, 'title');
//CDUpperCase::makeString($cd, 'band');
//CDUpperCase::makeArray($cd, 'tracks');
//echo CDMakeXML::create($cd);

class WebServiceFacade{
    public static function makeXMLCall($cd){
        CDUpperCase::makeString($cd, 'title');
        CDUpperCase::makeString($cd, 'band');
        CDUpperCase::makeArray($cd, 'tracks');
        $xml = CDMakeXML::create($cd);
        return $xml;
    }
}

echo WebServiceFacade::makeXMLCall($cd);