<?php
//委托模式-去除核心对象中的判决和复杂的功能性
//使用委托模式之前,调用cd类,选择cd播放模式是复杂的选择过程
class cd {
protected $cdInfo = array();
public function addSong($song) {
$this->cdInfo[$song] = $song;
}
public function playMp3($song) {
return $this->cdInfo[$song] . '.mp3';
}
public function playMp4($song) {
return $this->cdInfo[$song] . '.mp4';
}
}
$oldCd = new cd;
$oldCd->addSong("1");
$oldCd->addSong("2");
$oldCd->addSong("3");
$type = 'mp3';
if ($type == 'mp3') {
$oldCd->playMp3();
} else {
$oldCd->playMp4();
}
使用委托模式之后:
<?php
//委托模式-去除核心对象中的判决和复杂的功能性
//改进cd类
class cdDelegate {
protected $cdInfo = array();
public function addSong($song) {
$this->cdInfo[$song] = $song;
}
public function play($type, $song) {
$obj = new $type;
return $obj->playList($this->cdInfo, $song);
}
}
class mp3 {
public function playList($list) {
return $list[$song] . '.mp3';
}
}
class mp4 {
public function playList($list) {
return $list[$song] . '.mp4';
}
}
$newCd = new cd;
$newCd->addSong("1");
$newCd->addSong("2");
$newCd->addSong("3");
$type = 'mp3';
$oldCd->play('mp3', '1'); //只要传递参数就能知道需要选择何种播放模式
委托模式:通过分配和委托给其他对象,去除核心对象中的判决和复杂的功能性
通俗理解:有一张光盘,里面有MP3和MP4格式,那么cd在播放的时候,需要首先判断是MP3,或者MP4,然后调用自己播放MP3的方法,或者mp4的方法播放,但这样判断好多,烦人。那么我们就用委托模式,把MP3的播放方法和mp4的播放方法分别放到mp3和mp4中,cd只用调用给的统一接口就行,不用管这里面是什么,那么我想听MP3就放MP3的文件。