zoukankan      html  css  js  c++  java
  • PHP设计模式-代理模式

    概念理解:

    代理模式,是对简单处理程序(或指针)的增强,用于引用一个对象:这个指针被代理对象取代,代理对象位于客户端和真实程序之间,指针有一个可被多个目标利用的钩子。

    参与者:

    client(参与者):取决于主体(Subject)实现

    subject(主体):RealSubject的抽象

    realSubject(真实主体):完成代价高昂的工作或包含大量的数据

    proxy(代理):为Client提供一个与Subject一致的引用,仅在需要时才创建realSubject实例或与RealSubject实例通信

    关系模型:

    代码展示:

     LibsSubject.php

    <?php
    namespace Libs;
    
    interface Subject
    {
        public function getWidth();
        public function getHeight();
        public function getPath();
        public function dump();
    }

    LibsAbstractSubject.php

    <?php
    namespace Libs;
    
    abstract class AbstractSubject implements Subject
    {
        protected $_width;
        protected $_height;
        protected $_path;
        protected $_data;
        public function getWidth()
        {
            return $this->_width;
        }
        public function getHeight()
        {
            return $this->_height;
        }
        public function getPath()
        {
            return $this->_path;
        }
    
    }

    LibsRealSubject.php

    <?php
    namespace Libs;
    
    class RealSubject extends AbstractSubject
    {
        public function __construct($path)
        {
            echo "D<br/>";
            $this->_path = $path;
            list($this->_width,$this->_height) = getimagesize($path);
            $this->_data = file_get_contents($path);
            
        }
        public function dump()
        {
            echo "F<br/>";
            return $this->_data;
        }
    }

    LibsProxy.php

    <?php
    namespace Libs;
    
    class Proxy extends AbstractSubject
    {
        private $_realImage;
        public function __construct($path)
        {
            echo "A<br/>";
            $this->_path = $path;
            list($this->_width,$this->_height) = getimagesize($path);
        }
        
        protected function _lazyLoad()
        {
            echo "C<br/>";
            if($this->_realImage === null){
                $this->_realImage = new RealSubject($this->_path);
            }
        }
        public function dump()
        {
            echo "B<br/>";
            $this->_lazyLoad();
            echo "E<br/>";
            return $this->_realImage->dump();
        }
    }

    LibsPClient.php

    <?php
    namespace Libs;
    
    class PClient
    {
        public function tag(Subject $sub)
        {
            return $sub->dump();
        }
    }

    调用:

    $path = "pclient.png";
    $client = new PClient();
     
    $realSubject = new RealSubject($path);
    $client->tag($realSubject);
    echo "<hr/>";
    $proxy = new Proxy($path);
    $client->tag($proxy);

    结果:

    D
    F
    _____________________________________________
    A
    B
    C
    D
    E
    F

    推荐阅读>>

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

    PHP设计模式——代理模式

    php设计模式 Proxy (代理模式)

    《PHP设计模式介绍》第十一章 章代理模式

    PHP的代理模式

  • 相关阅读:
    C# 常用函数和方法集
    CSS选择器、优先级和匹配原理
    都是王安石惹的祸?
    世界上的一类
    历史之不可理喻片段
    历史惊人的相似
    20世纪鲜为人知的军事巨灾
    unity制作简单血条
    Unity中Instantiate物体失效问题
    Unity3D实现DoubleClick的一种方法
  • 原文地址:https://www.cnblogs.com/ddddemo/p/5627714.html
Copyright © 2011-2022 走看看