php 代理模式

1. 在客户端与实体之间建立一个代理对象(proxy),客户端对实体进行的操作全部委派给代理对象,隐藏实体的具体实现细节。
2. Proxy还可以与业务代码分离,部署到另外的服务器,业务代码中通过RPC来委派任务。

复制代码
//代理接口
interface Proxy
{
    public function getUserName($id);

    public function setUserName($id, $newName);
}

//用户操作代理实现
class UserProxy implements Proxy
{
    //读操作
    public function getUserName($id)
    {
        return Factory::getDataBase('slave')->find($id);
    }

    //写操作
    public function setUserName($id, $newName)
    {
        return Factory::getDataBase('master')->data(['name' => $newName])->where(['id' => $id])
    }
}

//代理模式:数据库主从,通过代理设置主从读写设置。
$proxy = new UserProxy();
$proxy->getUserName(1);
$proxy->setUserName(1, '张三');
 

通过代理实现MySQL的读写分离,如果是读操作,就连接127.0.0.1的数据库,写操作就读取127.0.0.2的数据库

<?php
class Proxy
{   
    protected $reader;
    protected $wirter;
    public function __construct(){
        $this->reader = new PDO('mysql:host=127.0.0.1;port=3306;dbname=CD;','root','password');
        $this->writer = new PDO('mysql:host=127.0.0.2;port=3306;dbname=CD;','root','password');
    }
    public function query($sql)
    {
        if (substr($sql, 0, 6) == 'select')
        {
            echo "读操作: ".PHP_EOL;
            return $this->reader->query($sql);
        }
        else
        {
            echo "写操作:".PHP_EOL;
            return  $this->writer->query($sql);
        }
    }
}
//数据库代理
$proxy = new Proxy;
//读操作
$proxy->query("select * from table");
//写操作
$proxy->query("INSERT INTO table SET title = 'hello' where id = 1");

//当然对于数据库来说,这里应该使用单例模式的方法来存放$reader和$writer,但我只是举个例子,不想把单例加进来把代码搞复杂。
//但是如果你要实现这样的一个数据库代理,我觉得还是有必要用上单例模式的知识

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值