面向对象的洗礼:设计模式(七)之代理模式
代理模式,是为其他对象提供一种代理以控制对这个对象的访问,代理模式是设计模式的一种。应用较为广泛,是一个对象需要访问另一个对象,出于某种原因或目的,在两个对象之间添加了一个中间对象。A对象访问B对象的方法,B对象的该方法实际是调用的C对象的方法,间接的完成了A对象对C对象的访问。这种模式叫做代理模式。
以PHP为代码环境,实现设计模式中的代理模式。
<?php abstract class Subject(){ abstract class Subject(){ public function actionA(); public function actionB(){; public function actionC(); } class Substance implements Subject(){ public function actionA(){ echo '方法A的实现'; } public function actionB(){ echo '方法B的实现'; } public function actionC(){ echo '方法C的实现'; } } class Proxy implements Subject(){ $protected $obj; public function __construct(){ $obj = new Substance(); } public function actionA(){ $this->obj->actionA; } public function actionB(){ $this->obj->actionB; } public function actionC(){ $this->obj->actionC; } } //客户端/接口 $obj = new Proxy(); $obj->actionA(); $obj->actionB(); $obj->actionC(); } ?>
代理模式的使用场景:(整理自大话设计模式一书)
第一、远程代理,为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
第二、虚拟代理,是根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的对象。
第三、安全代理,用来控制真实对象的访问权限。
第四、智能指引,是指当调用真实对象时,代理处理另外一些事情。(我的理解是,比如底层有一个封装好的Mysql类,在上层应用层读取数据库时,先经过一个代理类,可以检查数据完整性,参数合法性,计数器等等,然后由代理类调用真实的Mysql类)