• 设计模式之代理模式(php实现)



    github地址:https://github.com/ZQCard/design_pattern

    /**
     * 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。
     *  1、Windows 里面的快捷方式。
     * 2、猪八戒去找高翠兰结果是孙悟空变的,可以这样理解:把高翠兰的外貌抽象出来,高翠兰本人和孙悟空都实现了这个接口,
     * 猪八戒访问高翠兰的时候看不出来这个是孙悟空,所以说孙悟空是高翠兰代理类。
     * 3、买火车票不一定在火车站买,也可以去代售点。
     * 4、一张支票或银行存单是账户中资金的代理。支票在市场交易中用来代替现金,并提供对签发人账号上资金的控制。
     *优点:
     * 1、职责清晰。 2、高扩展性。 3、智能化。
     * 缺点:
     * 1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
     * 2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
     * 例子:从服务器读取一张图片的时候,第一次从硬盘读取,将资源对象代理,第二次读取的时候就使用代理对象去读取。
     */

    (1)Image.class.php(接口)

    <?php
    
    namespace Proxy;
    
    interface Image
    {
        public function display();
    }

    (2)RealImage.class.php

    <?php
    
    namespace Proxy;
    
    class RealImage implements Image
    {
        private $fileName;
    
        public function __construct($fileName)
        {
            $this->fileName = $fileName;
            $this->loadFromDisk($fileName);
        }
    
        public function display()
        {
            print_r("Displaying ". $this->fileName);
            echo '<pre/>';
        }
    
        private function loadFromDisk($fileName)
        {
            print_r("Loading ". $fileName);
            echo '<pre/>';
        }
    }

    (3)ProxyImage.class.php(代理类)

    <?php
    
    namespace Proxy;
    
    class ProxyImage implements Image
    {
        private $realImage;
        private $fileName;
    
        public function __construct($fileName)
        {
            $this->fileName = $fileName;
        }
    
        public function display()
        {
            if ($this->realImage == null){
                $this->realImage = new RealImage($this->fileName);
            }
            return $this->realImage->display();
        }
    }

    (4)proxy.php

    <?php
    
    spl_autoload_register(function ($className){
        $className = str_replace('\','/',$className);
        include $className.".class.php";
    });
    
    use ProxyProxyImage;
    
    $image = new ProxyImage('a.jpg');
    // 图像从磁盘加载
    $image->display();
    // 图像无法从磁盘加载
    $image->display();
  • 相关阅读:
    玩聚SD:感谢曹增辉的博客点评
    Social Dialogue征集IT意见领袖和优秀博客的RSS地址
    微软+Powerset>GoogleAdSense还是>GoogleSearch?
    1989旧金山地震:动物预测成功的非经典案例
    随手小记·危机来了与贪婪恐惧
    玩聚SD:感谢风言疯语之IT罗盘对玩聚SD的推荐
    独立思考之慎用孤例
    08软件技术英雄会:一次比一次接近完美
    独立思考之手动check
    MyBatisSpring MapperScannerConfigurer
  • 原文地址:https://www.cnblogs.com/zhouqi666/p/9152129.html
Copyright © 2020-2023  润新知