日韩天天综合网_野战两个奶头被亲到高潮_亚洲日韩欧美精品综合_av女人天堂污污污_视频一区**字幕无弹窗_国产亚洲欧美小视频_国内性爱精品在线免费视频_国产一级电影在线播放_日韩欧美内地福利_亚洲一二三不卡片区

《PHP設(shè)計(jì)模式介紹》第十一章 代理模式_PHP教程

編輯Tag賺U幣
教程Tag:暫無Tag,歡迎添加,賺取U幣!

推薦:《PHP設(shè)計(jì)模式介紹》第十章 規(guī)范模式
在一個應(yīng)用軟件的成型過程中,一些意想不到的商業(yè)邏輯到處出現(xiàn)。比如,基于價格的考慮,這個任務(wù)必須減少項(xiàng)目;而那個任務(wù)也因?yàn)殇N售稅而必須選擇合適的比率;而其它的任務(wù)也必須因?yàn)槠渌奶貏e

因?yàn)槟硞對象消耗太多資源,而且你的代碼并不是每個邏輯路徑都需要此對象, 你曾有過延遲創(chuàng)建對象的想法嗎 ( if和else就是不同的兩條邏輯路徑) ? 你有想過限制訪問某個對象,也就是說,提供一組方法給普通用戶,特別方法給管理員用戶?以上兩種需求都非常類似,并且都需要解決一個更大的問題:你如何提供一致的接口給某個對象讓它可以改變其內(nèi)部功能,或者是從來不存在的功能?

問題:

你怎樣才能在不直接操作對象的情況下,對此對象進(jìn)行訪問?

解決方案

代理模式是給某一個對象提供一個替代者(占位者),使之在client對象和subject對象之間編碼更有效率。代理可以提供延遲實(shí)例化(lazy instantiation),控制訪問, 等等,包括只在調(diào)用中傳遞。 一個處理純本地資源的代理有時被稱作虛擬代理。遠(yuǎn)程服務(wù)的代理常常稱為遠(yuǎn)程代理。強(qiáng)制控制訪問的代理稱為保護(hù)代理。

下面有一個關(guān)于遠(yuǎn)程代理的圖(只有一個方法)。 SoapClient是本地對象(客戶端)的媒介,通過調(diào)用SoapServer(subject)來獲得天氣信息。全部任務(wù)都通過HTTP協(xié)議達(dá)成,比如創(chuàng)建,傳輸,接收,通過SoapClient類內(nèi)部的功能解析復(fù)雜XML文檔完成遠(yuǎn)程通信。網(wǎng)絡(luò)返回的結(jié)果跟直接調(diào)用SoapServer對象API的效果一樣的,因此SoapClient可視為一個本地的代替者(代理),來獲得遠(yuǎn)程SoapServer的資源。

這里有其他不同種類的代理模式叫做smart 代理。它的作用是:在允許訪問subject對象之前增加一些各種各樣的附加邏輯(additional logic)。(譯注:這里的附加邏輯是指在建立了代理模式的基本結(jié)構(gòu)之后,根據(jù)自己的需求在代理模式中添加的代碼)

注:Handle-Body 模式

代理模式, 裝飾器模式, 和適配器模式從編碼角度看,都有類似的結(jié)構(gòu)的(后兩個模式在下面兩章講)。

三種模式本質(zhì)區(qū)別在于如何使用它們。

這個結(jié)構(gòu)的其他變種在下面網(wǎng)址可以找到:http://www。c2。com/cgi/wiki?HandleBodyPattern。

理的本質(zhì)是用一個實(shí)例化變量對subject對象進(jìn)行引用,通過調(diào)用代理類的方法操作subject類。

讓我們看一個代理模式的最簡單形態(tài),首先,你需要創(chuàng)建一個subject類用于代理。


// PHP4
class Subject {
function someMethod() {
sleep(1); //do something
}
}

下一步,你需要一個代理類,這個類需要實(shí)例化subject類用于代理。

class ProxySubject {
var $subject;
function ProxySubject() {
$this->subject =& new Subject;
}
}

在上面的ProxySubject類,在構(gòu)造器中創(chuàng)建了subject對象(還有其他的可供選擇的方法,比如通過傳遞一個參數(shù)給構(gòu)造器或者用工廠創(chuàng)建subject對象,這些都是同樣可行的)。

最后,你的代理類提供所有公有的方法必須讓subject類支持。在這個案例上, someMethod()就是這樣一個方法。

class ProxySubject {
var $subject;
function ProxySubject() {
$this->subject =& new Subject;
}
function someMethod() {
$this->subject->someMethod();
}
}

ProxySubject類通過$this->subject->someMethod()才真正的調(diào)用Subject類。

代理既可以有一些方法直接調(diào)用,又可以在調(diào)用之前使用一些附加邏輯(延遲加載,監(jiān)視)。

這里用了一個UML類圖表示ProxySubject類:

一個簡單的例子


上面的簡單例子展示了代理模式的基本結(jié)構(gòu),當(dāng)然我們需要一些更有趣和實(shí)際的例子。

分享:《PHP設(shè)計(jì)模式介紹》第九章 觀測模式
一些面向?qū)ο蟮木幊谭绞剑峁┝艘环N構(gòu)建對象間復(fù)雜網(wǎng)絡(luò)互連的能力。當(dāng)對象們連接在一起時,它們就可以相互提供服務(wù)和信息。 通常來說,當(dāng)某個對象的狀態(tài)發(fā)生改變時,你仍然需要對象之間能互

共4頁上一頁1234下一頁
來源:模板無憂//所屬分類:PHP教程/更新時間:2008-08-22
相關(guān)PHP教程