代理设计模式构建了透明置于两个不同对象之内的一个对象,从而能够截取或代理这两个对象间的通信或访问。
代理模式就是为其他对象提供一个代理以控制对这个对象的访问。代理模式的核心如下:提供访问、只按需引起开销、以及持续数据存储。
实例一:通过代理服务器实现访问
demo1.php1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
header('Content-Type:text/html; charset=utf-8');
class Internet{
private $ip;
public function __construct($ip){
$this->ip = $ip;
}
public function getServer(){
return $this->connect();
}
public function connect(){
return $this->ip.'欢迎来到全球互联网,我们提供冲浪,视频,游戏等服务!';
}
}
$internet = new Internet('111.111.111.111');
echo $internet->getServer();
访问全球互联网:通过代理服务器实现访问
demo2.php1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
header('Content-Type:text/html; charset=utf-8');
class Internet{
private $ip;
public function __construct($ip){
$this->ip = $ip;
}
protected function getServer(){
return $this->connect();
}
protected function connect(){
return $this->ip.'欢迎来到全球互联网,我们提供冲浪,视频,游戏等服务!';
}
}
class Proxy extends Internet{
public function getServer(){
return '代理网欢迎您的光临'.$this->connect();
}
}
$proxy = new Proxy('111.111.111.111');
echo $proxy->getServer();
通过代理模式,可以实现访问控制,级别访问控制,也可以避免直接创建 Internet 引起
的比如数据库连接等开销,Proxy 可以延迟。
实例一:通过代理实现数据库访问
直接访问数据库
demo3.php1
2
3
4
5
6
7
8
9
header('Content-Type:text/html; charset=utf-8');
$db = Factory::getDatabase('slave');
$info = $db->query('select * from user where id=1');
var_dump($info);
$db = Factory::getDatabase('master');
$db->query("update user set name='suse' where id =1");
通过代理访问数据库
demo4.php1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
header('Content-Type:text/html; charset=utf-8');
interface IUserProxy{
function getUserName($id);
function setUserName($id, $name);
}
class Proxy implements IUserProxy{
function getUserName($id){
$db = Factory::getDatabase('slave');
$db->query("select name from user where id =$id");
}
function setUserName($id, $name){
$db = Factory::getDatabase('master');
$db->query("update user set name = $name where id =$id");
}
}
$proxy = new Proxy();
$info = $proxy->getUserName(1);
var_dump($info);
$proxy->setUserName(1, 'suse');
代理模式
- 在客户端与实体之间建立一个代理对象(proxy),客户端对实体进行操作全部委派给代理对象,隐藏实体的具体实现细节。
- Proxy还可以与业务代码分离,部署到另外的服务器。业务代码中通过RPC来委派任务。