PHP设计模式之代理模式

代理设计模式构建了透明置于两个不同对象之内的一个对象,从而能够截取或代理这两个对象间的通信或访问。
代理模式就是为其他对象提供一个代理以控制对这个对象的访问。代理模式的核心如下:提供访问、只按需引起开销、以及持续数据存储。

实例一:通过代理服务器实现访问

demo1.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
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.php

1
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
<?php
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.php

1
2
3
4
5
6
7
8
9
<?php
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.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
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');

代理模式

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