代理,指的就是一个角色代表另一个角色采取行动,就象生活中,一个红酒厂商,是不会直接把红酒零售客户的,都是通过代理来完成他的销售业务。而客户,也不用为了喝红酒而到处找工厂,他只要找到厂商在当地的代理就行了,具体红酒工厂在那里,客户不用关心,代理会帮他处理。
代理模式,就是给某一对象提供代理对象,并由代理对象控制具体对象的引用。
代理模式涉及的角色:
抽象主题角色,声明了代理主题和真实主题的公共接口,使任何需要真实主题的地方都能用代理主题代替。
代理主题角色,含有真实主题的引用,从而可以在任何时候操作真实主题,代理主题功过提供和真实主题相同的接口,使它可以随时代替真实主题。代理主题通过持有真实主题的引用,不但可以控制真实主题的创建或删除,可以在真实主题被调用前进行拦截,或在调用后进行某些操作。
真实代理对象,定义了代理角色所代表的具体对象。
<?php
//定义一种类型的女人,王婆和潘金莲都属于这个类型的女人
interface KindWomen
{
//这种类型的女人能做什么事情呢?
public function makeEyesWithMan();//抛媚眼
publicfunction happyWithMan();//happy what? You know that!
}
//定一个潘金莲是什么样的人
class PanJinLian implements KindWomen
{
public function happyWithMan() {
echo "潘金莲在和男人做那个.....";
}
public function makeEyesWithMan() {
echo "潘金莲抛媚眼";
}
}
//王婆这个人老聪明了,她太老了,是个男人都看不上,
//但是她有智慧有经验呀,她作为一类女人的代理!
class WangPo implements KindWomen {
var $kindWomen;
//她可以是KindWomen的任何一个女人的代理,只要你是这一类型
public function WangPo($kindWomen = null){
if (empty($kindWomen)) {
$this->kindWomen =new PanJinLian();//默认的话,是潘金莲的代理
}else{
$this->kindWomen =$kindWomen;
}
}
//自己老了,干不了,可以让年轻的代替
public function happyWithMan() {
$this->kindWomen->happyWithMan();
}
//王婆这么大年龄了,谁看她抛媚眼?!
public function makeEyesWithMan() {
$this->kindWomen->makeEyesWithMan();
}
}
//定义一个西门庆,这人色中饿鬼
class XiMenQing
{
/*
* 水浒里是这样写的:西门庆被潘金莲用竹竿敲了一下难道,痴迷了,
* 被王婆看到了, 就开始撮合两人好事,王婆作为潘金莲的代理人
* 收了不少好处费,那我们假设一下:
* 如果没有王婆在中间牵线,这两个不要脸的能成吗?难说的很!
*/
public function __construct() {
//把王婆叫出来
$wangPo = new WangPo();
//然后西门庆就说,我要和潘金莲happy,然后王婆就安排了西门庆丢筷子的那出戏:
$wangPo->makeEyesWithMan(); //看到没,虽然表面上时王婆在做,实际上爽的是潘金莲
$wangPo->happyWithMan();
}
}
//开搞了
$XiMengQing = new XiMenQing();