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,但我只是举个例子,不想把单例加进来把代码搞复杂。
//但是如果你要实现这样的一个数据库代理,我觉得还是有必要用上单例模式的知识