PHP設(shè)計(jì)模式之代理模式代理人這個(gè)職業(yè)在中國(guó)有另外一個(gè)稱呼,房產(chǎn)經(jīng)濟(jì)人、保險(xiǎn)經(jīng)濟(jì)人,其實(shí)這個(gè)職業(yè)在國(guó)外都是叫做房產(chǎn)代理或者保險(xiǎn)代理。顧名思義,就是由他們來(lái)幫我們處理這些對(duì)我們大部分人來(lái)說(shuō)都比較生疏的專業(yè)領(lǐng)域的工作。代理模式也是一樣的道理,同時(shí),在這篇文章中還會(huì)簡(jiǎn)單的介紹正向代理和反向代理是怎么回事。 Gof類(lèi)圖及解釋GoF定義:為其它對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn) GoF類(lèi)圖
 代碼實(shí)現(xiàn)
interface Subject { public function Request(); }
class RealSubject implements Subject { function Request() { echo "真實(shí)的操作", PHP_EOL; } }
class Proxy implements Subject { private $realSubject;
public function __construct() { $this->realSubject = new RealSubject(); }
public function Request() { echo "代理的操作", PHP_EOL; $this->realSubject->Request(); } }
$proxy = new Proxy(); $proxy->Request();
代理模式的實(shí)現(xiàn)其實(shí)非常簡(jiǎn)單,或許你在不經(jīng)意間經(jīng)常會(huì)用到 請(qǐng)注意代理模式與裝飾器、適配器的區(qū)別,另外,模板方法模式也和它很像 裝飾器,一般是對(duì)對(duì)象進(jìn)行裝飾,其中的方法行為會(huì)有增加,以修飾對(duì)象為主 適配器,一般會(huì)改變方法行為,目的是保持接口的統(tǒng)一但得到不同的實(shí)現(xiàn) 模板方法模式,我們后面會(huì)講,這里只要知道,模板方法是在抽象類(lèi)中去組合調(diào)用子類(lèi)的方法 代理模式有幾種形式:遠(yuǎn)程代理(例如:第三方接口SDK)、虛代理(例如:異步加載圖片)、保護(hù)代理&智能指引(例如:權(quán)限保護(hù)),而我們代碼實(shí)現(xiàn)的最普通的代理,其實(shí)就是讓代理類(lèi)來(lái)代替真實(shí)類(lèi)的操作
完整代碼:https://github.com/zhangyue0503/designpatterns-php/blob/master/12.proxy/source/proxy.php 實(shí)例短信功能不能停,這回用簡(jiǎn)單的代理模式來(lái)增加一些前后的提示吧! 短信發(fā)送類(lèi)圖
 完整源碼:https://github.com/zhangyue0503/designpatterns-php/blob/master/12.proxy/source/proxy-msg.php <?php
interface SendMessage { public function Send(); }
class RealSendMessage implements SendMessage { public function Send() { echo '短信發(fā)送中...', PHP_EOL; } }
class ProxySendMessage implements SendMessage { private $realSendMessage;
public function __construct($realSendMessage) { $this->realSendMessage = $realSendMessage; }
public function Send() { echo '短信開(kāi)始發(fā)送', PHP_EOL; $this->realSendMessage->Send(); echo '短信結(jié)束發(fā)送', PHP_EOL; } }
$sendMessage = new ProxySendMessage(new RealSendMessage()); $sendMessage->Send();
說(shuō)明
例子非常簡(jiǎn)單,還是普通代理的實(shí)現(xiàn),這里我們講下正向代理和反向代理 通常我們所說(shuō)的科學(xué)上網(wǎng)(fanqiang),就是正向代理,由我們使用軟件或者自己配置代理網(wǎng)關(guān)上網(wǎng),實(shí)際就是我們把請(qǐng)求發(fā)送到指定的網(wǎng)關(guān),再由這個(gè)網(wǎng)關(guān)代替我們?nèi)ピL問(wèn)其他網(wǎng)站,這種由我們指定選擇的代理就是正向代理 PHPer們大多還是比較清楚反向代理的,畢竟現(xiàn)在Nginx已經(jīng)代替Apache成為了PHP標(biāo)配了。當(dāng)我們?cè)L問(wèn)一個(gè)網(wǎng)站的時(shí)候,某些路徑或者域名并不一定是在這臺(tái)服務(wù)器上,他們?cè)诜?wù)器上直接代理到了其他的服務(wù)器甚至是別人家的站點(diǎn)。對(duì)于這個(gè)我們這些瀏覽網(wǎng)站的人是不知道的,這種我們不知道就被莫名其妙代理了的情況就是反向代理,一般在服務(wù)后臺(tái)運(yùn)維中是必備知識(shí)!
下期看點(diǎn)代理模式說(shuō)簡(jiǎn)單也簡(jiǎn)單,說(shuō)復(fù)雜的話也很復(fù)雜,總之還是根據(jù)業(yè)務(wù)形態(tài)來(lái)決定,模式真的只是為了解決問(wèn)題而生的,問(wèn)題能解決了,你也可以叫他經(jīng)濟(jì)人模式嘛,你說(shuō)是不是??!下一篇我們一起學(xué)習(xí)享元模式,聽(tīng)著又很高大上吧??!
|