委托模式
通過分配或委托其他對象霹肝,委托設(shè)計模式能夠去除核心對象中的判決和復(fù)雜的功能性适掰。
應(yīng)用場景
設(shè)計了一個cd類颂碧,類中有mp3播放模式荠列,和mp4播放模式
改進前,使用cd類的播放模式载城,需要在實例化的類中去判斷選擇什么方式的播放模式
改進后肌似,播放模式當(dāng)做一個參數(shù)傳入playList函數(shù)中,就自動能找到對應(yīng)需要播放的方法诉瓦。
代碼:cd類川队,未改進之前,選擇播放模式是一種痛苦的事情 睬澡。
<?php
//委托模式-去除核心對象中的判決和復(fù)雜的功能性
//使用委托模式之前固额,調(diào)用cd類,選擇cd播放模式是復(fù)雜的選擇過程
classcd{
protected$cdInfo=array();
publicfunctionaddSong($song){
$this->cdInfo[$song]=$song;
}
publicfunctionplayMp3($song){
return$this->cdInfo[$song].'.mp3';
}
publicfunctionplayMp4($song){
return$this->cdInfo[$song].'.mp4';
}
}
$oldCd=newcd;
$oldCd->addSong("1");
$oldCd->addSong("2");
$oldCd->addSong("3");
$type='mp3';
if($type=='mp3'){
$oldCd->playMp3();
}else{
$oldCd->playMp4();
}
>
代碼:通過委托模式猴贰,改進后的cd類
classcdDelegate{
protected$cdInfo=array();
publicfunctionaddSong($song){
$this->cdInfo[$song]=$song;
}
publicfunctionplay($type,$song){
$obj=new$type;
return$obj->playList($this->cdInfo,$song);
}
}
classmp3{
publicfunctionplayList($list){
return$list[$song];
}
}
classmp4{
publicfunctionplayList($list){
return$list[$song];
}
}
$newCd=newcd;
$newCd->addSong("1");
$newCd->addSong("2");
$newCd->addSong("3");
$type='mp3';
$oldCd->play('mp3','1');//只要傳遞參數(shù)就能知道需要選擇何種播放模式
參考:《PHP設(shè)計模式》Aaron Saray著