用PHP的反射實(shí)現(xiàn)委托模式的講解
委托模式是軟件設(shè)計(jì)模式中的一項(xiàng)基本技巧。在委托模式中,有兩個(gè)對(duì)象參與處理同一個(gè)請(qǐng)求,接受請(qǐng)求的對(duì)象將請(qǐng)求委托給另一個(gè)對(duì)象來(lái)處理。委托模式是一項(xiàng)基本技巧,許多其他的模式,如狀態(tài)模式、策略模式、訪(fǎng)問(wèn)者模式本質(zhì)上是在更特殊的場(chǎng)合采用了委托模式。
動(dòng)態(tài)委托的介紹:動(dòng)態(tài)委托概念來(lái)自于Jakarta 字節(jié)碼工程庫(kù) (Byte-Code Engineering Library, BCEL)。它能夠分析存在的類(lèi),并且對(duì)于接口,抽象類(lèi),甚至運(yùn)行時(shí)的具體類(lèi)來(lái)說(shuō),它能夠生成以字節(jié)編碼委托類(lèi)。
被委托的接口/類(lèi)應(yīng)該滿(mǎn)足如下條件:動(dòng)態(tài)委托最多只能委托一個(gè)類(lèi),但是能夠代理多個(gè)接口。這個(gè)限制來(lái)自于Java的單繼承模式。一個(gè)Java類(lèi)最多只有一個(gè)父類(lèi)。既然生成的委托類(lèi)把被委托類(lèi)作為它的父類(lèi),那么指定多個(gè)被委托類(lèi)是不合理的。如果沒(méi)有指定被委托類(lèi),那么缺省的父類(lèi)就是Object。
下面是PHP 反射機(jī)制實(shí)現(xiàn)動(dòng)態(tài)代理的代碼:
target[] = new Fruit();
}
function __call($name, $args)
{
foreach ($this->target as $obj)
{
$r = new ReflectionClass($obj);
if ($method = $r->getMethod($name))
{
if ($method->isPublic() && !$method->isAbstract())
{
return $method->invoke($obj, $args);
}
}
}
}
}
$obj = new FruitDelegator();
$obj->callFruit();
// 運(yùn)行結(jié)果
// Generate an Apple
?>
可見(jiàn),通過(guò)代理類(lèi)FruitDelegator來(lái)代替Fruit類(lèi)來(lái)實(shí)現(xiàn)他的方法。
同樣的,如下的代碼也是能夠運(yùn)行的:
target[] = $obj;
}
function __call($name, $args)
{
foreach ($this->target as $obj)
{
$r = new ReflectionClass($obj);
if ($method = $r->getMethod($name))
{
if ($method->isPublic() && !$method->isAbstract())
{
return $method->invoke($obj, $args);
}
}
}
}
}
$obj = new ColorDelegator();
$obj->addObject(new Color());
$obj->callColor();
?>
傳統(tǒng)方式:
在傳統(tǒng)方式下,我們需要判斷當(dāng)前操作是取款操作還是存款操作,在分別調(diào)用Bank類(lèi)中的取款操作和存款操作。
委托模式:
在委托模式下,我們將不需要客戶(hù)端的判斷操作,對(duì)客戶(hù)端來(lái)說(shuō),需要什么操作,直接傳入操作類(lèi)型即可,Bank類(lèi)可自動(dòng)判斷操作類(lèi)型,返回相應(yīng)操作的操作結(jié)果。當(dāng)我們的操作類(lèi)型非常多的時(shí)候,在客戶(hù)端用if else判斷無(wú)疑是很可怕的,再假如我們?cè)诤芏嗟胤蕉家羞@塊判斷代碼,我們需要對(duì)這些地方的判斷代碼都進(jìn)行修改(加入后來(lái)添加的判斷),而采用委托模式,我們僅僅需要在新添加的地方添加相應(yīng)需要的類(lèi)型即可,不需要改動(dòng)其它地方的客戶(hù)端代碼(很大程度上提高了代碼的復(fù)用性)。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
- PHP的反射動(dòng)態(tài)獲取類(lèi)方法、屬性、參數(shù)操作示例
- php面試實(shí)現(xiàn)反射注入的詳細(xì)方法
- PHP反射原理與用法深入分析
- php提供實(shí)現(xiàn)反射的方法和實(shí)例代碼
- PHP進(jìn)階學(xué)習(xí)之反射基本概念與用法分析
- php反射學(xué)習(xí)之不用new方法實(shí)例化類(lèi)操作示例
- PHP反射學(xué)習(xí)入門(mén)示例
- PHP反射實(shí)際應(yīng)用示例
- 淺析PHP類(lèi)的反射來(lái)實(shí)現(xiàn)依賴(lài)注入過(guò)程
- PHP基于反射機(jī)制實(shí)現(xiàn)自動(dòng)依賴(lài)注入的方法詳解
- PHP基于反射獲取一個(gè)類(lèi)中所有的方法
- PHP反射基礎(chǔ)知識(shí)回顧
相關(guān)文章
PHP 創(chuàng)建標(biāo)簽云函數(shù)代碼
PHP創(chuàng)建標(biāo)簽云函數(shù)代碼,使用此函數(shù)創(chuàng)建標(biāo)簽云。2010-05-05
php access 數(shù)據(jù)連接與讀取保存編輯數(shù)據(jù)的實(shí)現(xiàn)代碼
腳本之家會(huì)給出一個(gè)php+access的留言本源碼,大家可以參考下?;旧蠈?duì)php access的操作就熟悉了。2010-05-05
php實(shí)現(xiàn)監(jiān)控varnish緩存服務(wù)器的狀態(tài)
這篇文章主要介紹了php實(shí)現(xiàn)監(jiān)控varnish緩存服務(wù)器的狀態(tài),Varnish是一款高性能的開(kāi)源HTTP加速器,可以替代Squid、Nginx等服務(wù)器,需要的朋友可以參考下2014-12-12
PHP門(mén)面模式實(shí)現(xiàn)簡(jiǎn)單的郵件發(fā)送示例
這篇文章主要為大家介紹了PHP門(mén)面模式實(shí)現(xiàn)簡(jiǎn)單的郵件發(fā)送示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
PHP中include()與require()的區(qū)別說(shuō)明
本文主要介紹了PHP中include()與require()的區(qū)別。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-02-02
php實(shí)現(xiàn)遞歸與無(wú)限分類(lèi)的方法
這篇文章主要介紹了php實(shí)現(xiàn)遞歸與無(wú)限分類(lèi)的方法,涉及php的遞歸操作技巧,需要的朋友可以參考下2015-02-02
用PHP即時(shí)捕捉PHP中的錯(cuò)誤并發(fā)送email通知的實(shí)現(xiàn)代碼
這段代碼,其用意就是當(dāng)我們寫(xiě)的php程式出錯(cuò)的時(shí)候把錯(cuò)誤內(nèi)容捕捉出來(lái)然后發(fā)到我們的email內(nèi),方便我們排錯(cuò)2013-01-01

