新闻资讯

洞悉互联网前沿资讯,探寻网站优化规律。

浅谈PHP设计模式之代理模式

发表日期:2016-11-22 13:21:28   文章编辑:红海小编   浏览次数:0

规划办法( Design Pattern)是从建筑规划范畴引进到计算机科学的。规划办法是对软件规划中普遍存在(且重复呈现)的各种疑问,所提出的处理计划。规划办法并不直接用来完结程序码的编写,而是描述在各种不一样情况下,要怎样处理疑问的一种计划。

更多对于PHP规划办法方面的入门与运用能够参阅本溪红海传媒广告之前的报导《运用规划办法改进程序结构》以及《架构、结构、规划办法之间的联络简述》。

咱们常常看到对于Java和.NET平台上规划办法的论说和解说,其实,在PHP 5对面向方针的支撑愈加完善之后,规划办法的运用也可引进到PHP中并表现重要作用。本溪红海传媒广告将从本周起以每周一期的办法连载《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. /**
  3.  * Subject interface.  
  4.  * Client depends only on this abstraction.  
  5.  */ 
  6. interface Image  
  7. {  
  8.     public function getWidth();  
  9.  
  10.     public function getHeight();  
  11.  
  12.     public function getPath();  
  13.  
  14.     /**
  15.      * @return string   the image's byte stream  
  16.      */ 
  17.     public function dump();  
  18. }  
  19.  
  20. /**
  21.  * Abstract class to avoid repetition of boilerplate code in the Proxy  
  22.  * and in the Subject. Only the methods which can be provided without  
  23.  * instancing the RealSubject are present here.  
  24.  */ 
  25. abstract class AbstractImage implements Image  
  26. {  
  27.     protected $_width;  
  28.     protected $_height;  
  29.     protected $_path;  
  30.     protected $_data;  
  31.  
  32.     public function getWidth()  
  33.     {  
  34.         return $this->_width;  
  35.     }  
  36.  
  37.     public function getHeight()  
  38.     {  
  39.         return $this->_height;  
  40.     }  
  41.  
  42.     public function getPath()  
  43.     {  
  44.         return $this->_path;  
  45.     }  
  46. }  
  47.  
  48. /**
  49.  * The RealSubject. Always loads the image, even if no dump of the data  
  50.  * is required.  
  51.  */ 
  52. class RawImage extends AbstractImage  
  53. {  
  54.     public function __construct($path)  
  55.     {  
  56.         $this->_path = $path;  
  57.         list ($this->_width, $this->_height) = getimagesize($path);  
  58.         $this->_data = file_get_contents($path);  
  59.     }  
  60.  
  61.     public function dump()  
  62.     {  
  63.         return $this->_data;  
  64.     }  
  65. }  
  66.  
  67. /**
  68.  * Proxy. Defers loading the image data until it becomes really mandatory.  
  69.  * This class does its best to postpone the very expensive operations  
  70.  * such as the actual loading of the BLOB.  
  71.  */ 
  72. class ImageProxy extends AbstractImage  
  73. {  
  74.     public function __construct($path)  
  75.     {  
  76.         $this->_path = $path;  
  77.         list ($this->_width, $this->_height) = getimagesize($path);  
  78.     }  
  79.  
  80.     /**
  81.      * Creates a RawImage and exploits its functionalities.  
  82.      */ 
  83.     protected function _lazyLoad()  
  84.     {  
  85.         if ($this->_realImage === null) {  
  86.             $this->_realImage = new RawImage($this->_path);  
  87.         }  
  88.     }  
  89.  
  90.     public function dump()  
  91.     {  
  92.         $this->_lazyLoad();  
  93.         return $this->_realImage->dump();  
  94.     }  
  95. }  
  96.  
  97. /**
  98.  * Client class that does not use the data dump of the image.  
  99.  * Passing blindly a Proxy to this class and to other Clients makes sense  
  100.  * as the data would be loaded anyway when Image::dump() is called.  
  101.  */ 
  102. class Client  
  103. {  
  104.     public function tag(Image $img)  
  105.     {  
  106.         return ';  
  107.     }  
  108. }  
  109.  
  110. $path = '/home/giorgio/shared/Immagini/kiki.png';  
  111. $client = new Client();  
  112.  
  113. $image = new RawImage($path); // loading of the BLOB takes place  
  114. echo $client->tag($image), "/n";  
  115.  
  116. $proxy = new ImageProxy($path);  
  117. echo $client->tag($proxy), "/n"// loading does not take place even here 

以上代码完结了PHP的署理办法。简单来讲,署理办法即是为别的方针供给一个署理以操控对这个方针的拜访。

对于规划办法的别的方面

咱们知道了啥是规划办法以及PHP规划办法中的署理办法。这儿还有一些对于规划办法的基本概念应该被熟知。

◆算法不能算是一种规划办法,由于算法主要是用来处理计算上的疑问,而非规划上的疑问。

◆面向方针规划办法通常以种类或物件来描述其中的联络和相互作用,但不涉及用来完结运用程序的特定种类或物件。

◆规划办法主要是使不安稳的依赖于相对安稳、详细依赖于相对笼统,防止会引起麻烦的紧耦合,以增强软件规划面临并适应改变的才能。

◆并非一切的软件办法都是规划办法,规划办法特指软件规划层次上的疑问。还有其它非规划办法的办法,如架构办法。 

咱们会在下周继续为您连载《PHP规划办法闲谈》,敬请期待。

一键分享到:
返回列表

News

行业资讯

提供网站建设相关资讯、互联网行业资讯、网站设计知识、空间域名邮箱、网站解决方案、常见问题、签约新闻等

网站建设有关的重定向技术综述

2016-11-17 12:07:04

网站建设有关的重定向技术综述...

因为response是jsp页面中的隐含对象,故在jsp网站建设页面中可以用response.sendRedirect()直接完成重定位。 留意: (1).运用response.sendRedirect时,后面不克...

做网站要有创新意识

2016-11-18 23:32:44

做网站要有创新意识

立异于软件业,就比方钱于社会人,立异不是全能的,没有立异却是万万不能的。可是立异也象钱相同,不是说有就有,乃至不能说跟自个努力有决议联系。所以许多时分,媒体...

网站开发市场正面临着一场大“减肥”的运动

2016-11-18 23:33:21

网站开发市场正面临着一场大“减...

导读:本溪红海传媒网站12月4日在“特别报道”专栏中撰文指出:伴随着上个世纪90年代经济的高速增加,很多的商用软件层出不穷,而现在如此纷繁复杂的商...

网站建设公司所面临的困境

2016-11-18 23:36:31

网站建设公司所面临的困境...

教学构造单一   人才才能弱化   如今,我国软件人才的培育首要依托规范院校的学历教学,集中在本科期间。据统计,我国当时软件从业人员约有40万...

网站建设公司的明天

2016-11-18 23:37:58

网站建设公司的明天

在前不久的杀毒厂商降价热潮后,有人提出这个疑问?国内通用软件厂商在将来的存活点终究在哪里?之所以用“存活点”这个词汇来形容,是因为跟着对于个人...

2017年网站建设人才需求增加

2016-11-18 23:39:36

2017年网站建设人才需求增加...

《复兴软件工业举动大纲》日前正式发动。2002年9月18日,国务院办公厅转发了《复兴软件工业举动大纲(2002年至2005年)》(国办发〔2002〕47号)(以下简称《举动大纲...