• S3:代理模式 Proxy


    为其他对象提供一种代理以控制对这个对象的访问.

    使用场合:

    1.远程代理:为一个对象在不同的地址空间提供局部代表,隐藏对象存在于不同地址空间的事实.
    2.虚拟代理:根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象.
    3.安全代理:用来控制真实对象访问时的权限.
    4.智能指引:当调用真实对象时,代理处理另外一些事.

    UML:

    示例代码:

    interface AbstractSubject
    {
        public function connect();
    }
    
    class RealSubject implements AbstractSubject
    {
        public function connect()
        {
            echo 'link to db';
        }
    }
    
    
    class ProxySubject implements AbstractSubject
    {
        protected $real;
    
        public function __construct()
        {
            if (is_null($this->real)) {
                $this->real = new RealSubject();
            }
        }
    
        public function connect()
        {
            $this->real->connect();
        }
    }
    
    $proxy = new ProxySubject();
    $proxy->connect();
    

      

    示例代码:

    abstract class MySQL
    {
        protected $link;
    
        protected function __construct()
        {
            $this->connect();
        }
    
        public function getAll($table)
        {
            echo get_called_class() . PHP_EOL;
            $res = $this->link->query("SELECT * FROM {$table}");
            $data = array();
    
            foreach ($res as $row) {
                $data[] = $row;
            }
            return $data;
        }
    
        public function close()
        {
            $this->link = null;
        }
    
        abstract public static function getInstance();
    }
    
    class ReadMySQL extends MySQL
    {
        protected static $instance;
    
        public static function getInstance()
        {
            if (is_null(self::$instance)) {
                self::$instance = new self(); 
            }
            return self::$instance;
        }
    
        public function connect()
        {
            if (is_null($this->link)) {
                $this->link = new PDO('mysql:host=127.0.0.1;dbname=test', 'root', 'root');
            }
        }
    }
    
    class WriteMySQL extends MySQL
    {
        protected static $instance;
    
        public static function getInstance()
        {
            if (is_null(self::$instance)) {
                self::$instance = new self(); 
            }
            return self::$instance;
        }
    
        public function connect()
        {
            if (is_null($this->link)) {
                $this->link = new PDO('mysql:host=192.168.2.10;dbname=test', 'root', 'root');
            }
        }
    }
    
    class ProxyMysql
    {
        private $reader;
        private $writer;
    
        public function __construct()
        {
            $this->reader = ReadMySQL::getInstance();
            $this->writer = WriteMySQL::getInstance();
        }
    
        public function getAll($table)
        {
            if (rand(1,2) === 1) {
                return $this->reader->getAll($table);
            } else {
                return $this->writer->getAll($table);
            }
        }
    }
    
    $test = new ProxyMysql();
    var_dump($test->getAll('test'));
    var_dump($test->getAll('test'));
    var_dump($test->getAll('test'));
    var_dump($test->getAll('test'));
    

      

    我们用ProxyMysql代理了ReaderMysql和WriterMysql,简单的随机判断从两台服务器读取数据.

  • 相关阅读:
    【iBoard电子学堂开发板例程】【12个 stm32 例程发布】
    【iCore双核心组合是开发板例程】【12个 verilog 中级实验例程发布】
    【新产品发布】【iHMI43 智能液晶模块 2013 版】
    【新产品发布】【EVC8001 磁耦隔离式 USB 转 RS-485】
    【iHMI43真彩液晶模块】发布新版 DEMO 软件包,版本号为 0.14
    【新产品发布】【iCore2 ARM / FPGA 双核心板】
    急性淋巴瘤化疗术后高热不退案
    产后便秘案
    药疹治案
    胃癌化疗后急救案
  • 原文地址:https://www.cnblogs.com/itfenqing/p/7787804.html
Copyright © 2020-2023  润新知