成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

PHP設計模式漫談之代理模式

原創
開發 后端 前端
PHP也有設計模式?是的,我們經常看到關于Java和.NET平臺上設計模式的論述和講解,其實,在PHP 5對面向對象的支持更加完善之后,設計模式的應用也可引入到PHP中并發揮重要作用。

【51CTO獨家特稿】設計模式( Design Pattern)是從建筑設計領域引入到計算機科學的。設計模式是對軟件設計中普遍存在(且反復出現)的各種問題,所提出的解決方案。設計模式并不直接用來完成程序碼的編寫,而是描述在各種不同情況下,要怎么解決問題的一種方案。

更多關于PHP設計模式方面的入門與應用可以參考51CTO之前的報道《使用設計模式改善程序結構》以及《架構、框架、設計模式之間的關系簡述》。

我們經常看到關于Java和.NET平臺上設計模式的論述和講解,其實,在PHP 5對面向對象的支持更加完善之后,設計模式的應用也可引入到PHP中并發揮重要作用。51CTO.com將從本周起以每周一期的形式連載《PHP設計模式漫談》的系列文章,以理論與代碼實例相結合的方式講解PHP中的設計模式。希望對從事PHP研發的讀者有所幫助。

今天我們要談的是PHP設計模式中的代理模式(Proxy),它是對簡單處理程序(或指針)的增強,用于引用一個對象:這個指針被代理(Proxy)對象取代,代理對象位于客戶端(Client)和真實執行程序之間,指針有一個可被多個目標利用的鉤子。

從技術上講,這種模式在客戶端和真實主體(RealSubject)之間插入一個代理對象,維護subject接口和用不同的方式委派它的方法。代理可以透明地做任何事情:懶散創建RealSubject或載入數據,與其它機器交換消息,寫時復制策略等。這與HTTP代理有點類似,其客戶端(如瀏覽器)和應用程序依賴于與HTTP服務器的聯系,代理在管理連接時可以完成其它任務,如訪問控制和緩存大型下載文件。

PHP設計模式中的代理模式
PHP設計模式中的代理模式示例

代理模式的對象圖與裝飾模式對象圖在結構上類似,但表達的目的各有不同,裝飾者給對象動態增加行為,而代理則控制來自客戶端的訪問。此外,代理只在需要時才創建RealSubject。 

參與者

客戶端(Client):取決于主體(Subject)實現;

主體(Subject):RealSubject的抽象;

真實主體(RealSubject):完成代價高昂的工作或包含大量的數據;

代理(Proxy):為Client提供一個與Subject一致的引用,僅在需要時才創建RealSubject實例或與RealSubject實例通信。

下面是兩個被廣泛使用的代理模式例子:

1、對象-關系映射(Orms)在運行中創建代理作為實體類的子類,以實現懶散加載(虛擬代理),這個代理會覆蓋所有實體方法,在前面追加一個載入程序,在方法被真正調用前不會包含任何數據,Orms代理支持對象間的雙向關系,不用加載整個數據庫,因為它們被置于當前加載對象圖的邊界。

2、Java RMI使用遠程代理對象(遠程代理),當它們的方法被調用時,代理序列化參數,執行網絡上的請求,委托調用另一個節點上的真實對象,這種技術允許透明地調用遠程對象,不用擔心它們是否在同一臺機器上,但這種透明度很容易會使執行速度變慢。

下面的代碼示例實現了一個ImageProxy,推遲了圖像數據的加載。

  1. /**  
  2.  * Subject interface.  
  3.  * Client depends only on this abstraction.  
  4.  */ 
  5. interface Image  
  6. {  
  7.     public function getWidth();  
  8.  
  9.     public function getHeight();  
  10.  
  11.     public function getPath();  
  12.  
  13.     /**  
  14.      * @return string   the image's byte stream  
  15.      */ 
  16.     public function dump();  
  17. }  
  18.  
  19. /**  
  20.  * Abstract class to avoid repetition of boilerplate code in the Proxy  
  21.  * and in the Subject. Only the methods which can be provided without  
  22.  * instancing the RealSubject are present here.  
  23.  */ 
  24. abstract class AbstractImage implements Image  
  25. {  
  26.     protected $_width;  
  27.     protected $_height;  
  28.     protected $_path;  
  29.     protected $_data;  
  30.  
  31.     public function getWidth()  
  32.     {  
  33.         return $this->_width;  
  34.     }  
  35.  
  36.     public function getHeight()  
  37.     {  
  38.         return $this->_height;  
  39.     }  
  40.  
  41.     public function getPath()  
  42.     {  
  43.         return $this->_path;  
  44.     }  
  45. }  
  46.  
  47. /**  
  48.  * The RealSubject. Always loads the image, even if no dump of the data  
  49.  * is required.  
  50.  */ 
  51. class RawImage extends AbstractImage  
  52. {  
  53.     public function __construct($path)  
  54.     {  
  55.         $this->_path = $path;  
  56.         list ($this->_width, $this->_height) = getimagesize($path);  
  57.         $this->_data = file_get_contents($path);  
  58.     }  
  59.  
  60.     public function dump()  
  61.     {  
  62.         return $this->_data;  
  63.     }  
  64. }  
  65.  
  66. /**  
  67.  * Proxy. Defers loading the image data until it becomes really mandatory.  
  68.  * This class does its best to postpone the very expensive operations  
  69.  * such as the actual loading of the BLOB.  
  70.  */ 
  71. class ImageProxy extends AbstractImage  
  72. {  
  73.     public function __construct($path)  
  74.     {  
  75.         $this->_path = $path;  
  76.         list ($this->_width, $this->_height) = getimagesize($path);  
  77.     }  
  78.  
  79.     /**  
  80.      * Creates a RawImage and exploits its functionalities.  
  81.      */ 
  82.     protected function _lazyLoad()  
  83.     {  
  84.         if ($this->_realImage === null) {  
  85.             $this->_realImage = new RawImage($this->_path);  
  86.         }  
  87.     }  
  88.  
  89.     public function dump()  
  90.     {  
  91.         $this->_lazyLoad();  
  92.         return $this->_realImage->dump();  
  93.     }  
  94. }  
  95.  
  96. /**  
  97.  * Client class that does not use the data dump of the image.  
  98.  * Passing blindly a Proxy to this class and to other Clients makes sense  
  99.  * as the data would be loaded anyway when Image::dump() is called.  
  100.  */ 
  101. class Client  
  102. {  
  103.     public function tag(Image $img)  
  104.     {  
  105.         return '$img->getPath() . '" alt="" width="' 
  106.              . $img->getWidth() . '" height="'   
  107.              . $img->getHeight() . '" />';  
  108.     }  
  109. }  
  110.  
  111. $path = '/home/giorgio/shared/Immagini/kiki.png';  
  112. $client = new Client();  
  113.  
  114. $image = new RawImage($path); // loading of the BLOB takes place  
  115. echo $client->tag($image), "\n";  
  116.  
  117. $proxy = new ImageProxy($path);  
  118. echo $client->tag($proxy), "\n"// loading does not take place even here 

以上代碼實現了PHP的代理模式。簡單來講,代理模式就是為其他對象提供一個代理以控制對這個對象的訪問。

關于設計模式的其他方面

我們知道了什么是設計模式以及PHP設計模式中的代理模式。這里還有一些關于設計模式的基本概念應該被熟知。

◆算法不能算是一種設計模式,因為算法主要是用來解決計算上的問題,而非設計上的問題。

◆面向對象設計模式通常以類別或物件來描述其中的關系和相互作用,但不涉及用來完成應用程序的特定類別或物件。

◆設計模式主要是使不穩定的依賴于相對穩定、具體依賴于相對抽象,避免會引起麻煩的緊耦合,以增強軟件設計面對并適應變化的能力。

◆并非所有的軟件模式都是設計模式,設計模式特指軟件設計層次上的問題。還有其它非設計模式的模式,如架構模式。 

我們會在下周繼續為您連載《PHP設計模式漫談》,敬請期待。

【編輯推薦】

  1. 鐘勝輝談PHP發展的現狀和前景
  2. Java設計模式與應用淺談
  3. 架構、框架、設計模式之間的關系簡述
  4. 專題:PHP開發基礎入門

 原文:Practical Php Patterns: Proxy

鏈接:http://giorgiosironi.blogspot.com/2010/02/practical-php-patterns-proxy.html

 

 

責任編輯:佚名 來源: 51CTO.com
相關推薦

2010-04-19 09:30:00

工廠模式PHP設計模式

2010-04-13 08:54:28

PHP設計模式命令模式

2010-04-08 09:27:04

PHP設計模式結構模式

2010-04-21 08:38:18

解釋器模式PHP設計模式

2010-04-01 09:10:03

PHP設計模式責任鏈模式

2010-04-29 08:53:11

PHP迭代器模式

2010-05-06 08:44:37

調解者模式

2012-02-29 09:41:14

JavaScript

2012-01-13 15:59:07

2021-06-29 08:54:23

設計模式代理模式遠程代理

2022-09-07 08:25:08

代理模式設計模式代碼

2011-04-21 09:46:41

設計模式

2011-04-06 11:41:25

Java動態代理

2020-08-21 07:23:50

工廠模式設計

2024-04-16 00:07:36

設計模式代理模式替身

2024-02-26 11:52:38

代理模式設計

2022-11-30 17:05:33

代碼程序場景

2021-06-09 08:53:34

設計模式策略模式工廠模式

2015-09-08 13:39:10

JavaScript設計模式

2021-06-16 08:56:06

模版方法模式設計模式行為型設計模式
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品国产综合区久久久久久久 | 日韩三级在线 | re久久| 亚洲欧美一区二区三区在线 | 久久国产精品久久 | 国产精品福利在线 | 亚欧洲精品在线视频免费观看 | 精品国产一区二区三区久久狼黑人 | 夜夜操天天艹 | 国产精品国产三级国产aⅴ入口 | 99视频在线播放 | 亚洲精品欧美 | 国产精品久久久久久久免费大片 | 国产婷婷精品av在线 | 国产精品日韩 | 欧美日韩专区 | 久久久久久久国产精品 | 久久久久久国产精品免费 | 亚洲精品国产成人 | 羞羞色视频 | 91精品一区二区三区久久久久久 | 中文字幕一页二页 | 国产精品久久久久久婷婷天堂 | 成人二区| 91精品国产色综合久久 | 91小视频在线 | 国产精品九九九 | 日干夜操| 国产日韩久久久久69影院 | 国产一级一级毛片 | 成人国产精品久久久 | 日韩影音| 国产一级片免费视频 | 中文字幕视频在线观看 | 欧美久久视频 | 欧美区日韩区 | 国产精品91久久久久久 | 毛片网站免费观看 | 日韩精品一区二区三区中文字幕 | 在线视频一区二区 | 欧美一区2区三区4区公司二百 |