1.装饰器模式
如果已有对象的部分内容或功能发生改变,但是不修改原始对象的结构,也不使用扩展类时,可以使用装饰器模式。
class CD
{
public $trackList;
public function __construct()
{
$this->trackList=array();
}
public function addTrack($track) //向CD中添加一首歌
{
$this->trackList[]=$track;
}
public function getTrackList()
{
$output=' ';
foreach($this->trackList as $num=>$track)
{
$output .= ($num+1) . "--{$track} ";
}
return $output;
}
}
调用时:
$trackExtends=array('Over My Head','Wake Me Up','Faint');
$myCD=new CD();
foreach($arrayExtends as $track)
$myCD->addTrack($track);
现在功能要把track的名字变为大写,在不修改原类和不使用继承的情况下,使用装饰器模式
class CDDecorator
{
private $__cd;
public function __construct(CD $cd)
{
$this->cd=$cd;
}
public function makeCaps
{
foreach($this->__cd->trackList as $track)
$track=strtoupper($track);
}
}
再次调用时:
$arrayExtends=array('Over My Head','Wake Me Up','Faint');
$myCD=new CD();
foreach($arrayExtends as $track)
$myCD->addTrack($track);
一张CD的信息需要进行两个操作:1.把CD相关信息转换为大写 2.生成一个XML文档
class CD
{
......
}
class CDUpperCase
{
public static function makeString(CD $cd,$type)
..
}
class CDMakeXML
{
public static function create(CD $cd)
....
}
之所以不把这两个类实现的功能直接加入CD类中,而是单独建类时为了之后重用方便着想。
调用时:
CDUpperCase::makeString($cd,'title');
CDUpperCase::makeString($cd,'band');
print CDMakeXML::create($cd);
用外观模式来实现:
class WebServiceFacade
{
public static function makeXMLCall(CD $cd)
{
CDUpperCase::makeString($cd,'title');CDUpperCase::makeString($cd,'band');
}
$xml=CDMakeXML::create($cd);
return $xml;
}
1.装饰器模式
如果已有对象的部分内容或功能发生改变,但是不修改原始对象的结构,也不使用扩展类时,可以使用装饰器模式。
class CD
{
public $trackList;
public function __construct()
{
$this->trackList=array();
}
public function addTrack($track) //向CD中添加一首歌
{
$this->trackList[]=$track;
}
public function getTrackList()
{
$output=' ';
foreach($this->trackList as $num=>$track)
{
$output .= ($num+1) . "--{$track} ";
}
return $output;
}
}
调用时:
$trackExtends=array('Over My Head','Wake Me Up','Faint');
$myCD=new CD();
foreach($arrayExtends as $track)
$myCD->addTrack($track);
现在功能要把track的名字变为大写,在不修改原类和不使用继承的情况下,使用装饰器模式
class CDDecorator
{
private $__cd;
public function __construct(CD $cd)
{
$this->cd=$cd;
}
public function makeCaps
{
foreach($this->__cd->trackList as $track)
$track=strtoupper($track);
}
}
再次调用时:
$arrayExtends=array('Over My Head','Wake Me Up','Faint');
$myCD=new CD();
foreach($arrayExtends as $track)
$myCD->addTrack($track);
一张CD的信息需要进行两个操作:1.把CD相关信息转换为大写 2.生成一个XML文档
class CD
{
......
}
class CDUpperCase
{
public static function makeString(CD $cd,$type)
..
}
class CDMakeXML
{
public static function create(CD $cd)
....
}
之所以不把这两个类实现的功能直接加入CD类中,而是单独建类时为了之后重用方便着想。
调用时:
CDUpperCase::makeString($cd,'title');
CDUpperCase::makeString($cd,'band');
print CDMakeXML::create($cd);
用外观模式来实现:
class WebServiceFacade
{
public static function makeXMLCall(CD $cd)
{
CDUpperCase::makeString($cd,'title');CDUpperCase::makeString($cd,'band');