手机版

深入分析PHP设计模式的代理模式

时间:2021-11-19 来源:互联网 编辑:宝哥软件园 浏览:

代理模式是对简单处理程序(或指针)的增强,用于引用一个对象:这个指针被一个Proxy对象代替,Proxy对象位于Client和真正的执行器之间,指针有一个钩子,可以被多个目标使用。从技术上讲,这种模式在客户端和RealSubject之间插入一个代理对象,维护Subject接口,并以不同的方式委托它。代理可以透明地做任何事情:创建RealSubject或延迟加载数据、与其他机器交换消息、写入时复制策略等等。这有点类似于HTTP代理,其客户端(如浏览器)和应用程序依赖于与HTTP服务器的连接,代理可以在管理连接时完成其他任务,如访问控制和缓存大型下载文件。

代理模式的对象图与装饰模式对象图在结构上类似,但表达的目的各有不同,装饰者给对象动态增加行为,而代理则控制来自客户端的访问。此外,代理只在需要时才创建真实主题。参与者:客户端(客户):取决于主体(主题)实现;主体(主题):真实主题的抽象;真实主体(真实主题):完成代价高昂的工作或包含大量的数据;代理(代理):为客户提供一个与科目一致的引用,仅在需要时才创建真实主题实例或与真实主题实例通信。下面是两个被广泛使用的代理模式例子:1、对象-关系映射(表单)在运行中创建代理作为实体类的子类,以实现懒散加载(虚拟代理),这个代理会覆盖所有实体方法,在前面追加一个载入程序,在方法被真正调用前不会包含任何数据,表单代理支持对象间的双向关系,不用加载整个数据库,因为它们被置于当前加载对象图的边界2、Java RMI使用远程代理对象(远程代理),当它们的方法被调用时,代理序列化参数,执行网络上的请求,委托调用另一个节点上的真实对象,这种技术允许透明地调用远程对象,不用担心它们是否在同一台机器上,但这种透明度很容易会使执行速度变慢。下面的代码示例实现了一个ImageProxy,推迟了图像数据的加载。复制代码代码如下:/** *主题界面。*客户端仅依赖于此抽象图像接口{公共函数GetWidth();公共函数GetHeight();公共函数getPath();/* * * @返回字符串图像的字节流*/公共函数dump();} /** *抽象类,以避免代理*和主题中重复样板代码。这里只提供了不需要实例化真实主题的方法。*/抽象类抽象图像实现图像{受保护的$ _ width受保护的$ _高度受保护的$ _路径;受保护的$ _数据;公共函数GetWidth(){ return $ this-_ width;}公共函数GetHeight(){ return $ this-_ height;} public function getPath(){ return $ this-_ path;} } /** *真实主题。始终加载映像,即使不需要转储数据*。*/类RawImage扩展了抽象图像{ public function _ _ construct($ path){ $ this-_ path=$ path;list ($this-_width,$ this-_ height)=getimagesize($ path);$ this-_ data=file _ get _ contents($ path);} public function dump(){ return $ this-_ data;} } /** *代理。推迟加载图像数据,直到它成为真正的强制性。*这个类尽最大努力推迟非常昂贵的操作*例如一滴的实际加载*/class ImageProxy扩展了抽象图像{ public function _ _ construct($ path){ $ this-_ path=$ path;list ($this-_width,$ this-_ height)=getimagesize($ path);} /** *创建原始图像并利用其功能*/protected function _ lazy load(){ if($ this-_ real image===null){ $ this-_ real image=new raw image($ this-_ path);} }公共函数dump(){ $ this-_ LazyLoad();返回$ this-_ realImage-dump();} } /** *不使用映像数据转储的客户端类。*盲目地将代理传递给这个类和其他客户端是有意义的*因为当调用Image:dump()时,无论如何都会加载数据*/类客户端<公共函数标记(Image $ img){ return };} } $ path='/home/Giorgio/shared/immangini/kiki。png ';$ Client=新客户端();$ image=new RawImage($ path);一滴的加载发生在echo $client-tag($image),“\ n”;$ proxy=new ImageProxy($ path);echo $client-tag($proxy)," \ n ";//即使在这里也不会加载以上代码实现了服务器端编程语言(专业超文本预处理器的缩写)的代理模式。简单来讲,代理模式就是为其他对象提供一个代理以控制对这个对象的访问。

版权声明:深入分析PHP设计模式的代理模式是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。