设计模式之代理模式–代理转发中间层
代理模式
是代理原来的类或对象,在不改变原有类或对象的基础上增加新的功能。
为其他对象提供一种代理以控制对这个对象的访问。
为什么要使用原型模式
代理模式最常用的场景比如我们开发的代理中间层,来代理前端的请求,隐藏真正的后端接口。还有很多远程代理,科学上网也属于代理的一种。
还有虚拟代理,比如浏览器的图片会先出现图片框在加载图片,图片框其实就是一个对图片的代理。
安全代理,用来控制真实对象的访问权限,这个也是代理中间层会做到的。
在我们的代码中一般会使用代理模式做一些原有类做不到的事情,对原有类的扩展。
比如打印sql
,打印日志
,发送通知
这些跟具体业务无关的功能增加。
这也更加符合开闭原则
。通过增加代理类的方式来增加功能而不是修改原来的类。
代理模式要求代理类
和原类
都实现同一个接口,也是对接口实现才能实现用代理类来替换原类。
//代理接口,代理类和原类都需要实现这个接口
interface IProxy{
public function proxy();
}
//代理类,实现代理接口,代理原类,客户端访问代理类
class proxy implements IProxy {
private $proxy;
function __construct(IProxy $proxy) {
//把要代理的原类传进来
$this->proxy = $proxy;
}
public function proxy() {
//前置功能
//访问原类
$this->proxy->proxy();
//后置功能
}
}
//原类
class product implements IProxy{
function proxy() {
//原类的功能
}
}
原来没有代理的时候,直接调用原类。
$product = new product();
$product->proxy();
有了代理类之后,客户端调用代理类,隐藏原类。
$proxy = new Proxy(new product());
$proxy->proxy();
其实就是套了一层壳。