Home  >  Article  >  Backend Development  >  php设计模式之代理模式

php设计模式之代理模式

WBOY
WBOYOriginal
2016-06-23 13:56:49948browse

代理模式【PROXY PATTERN】

header("Content-type: text/html; charset=UTF-8");
/**
 * 什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,
 * 那代理人总要知道被代理人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,
 * 代理人虽然不能干活,但是被代理的人能干活呀。
 */

// 比如西门庆找潘金莲,那潘金莲不好意思答复呀,咋办,找那个王婆做代理,表现在程序上时这样的:

// 先定义一种类型的女人:
/**
 * 定义一种类型的女人,王婆和潘金莲都属于这个类型的女人
 */
interface KindWomen{
    //这种类型的女人能做什么事情呢?
    public function makeEyesWithMan(); //抛媚眼
    public function happyWithMan(); //happy what? You know that!
}



/**
 * 定义一个潘金莲是什么样的人
 */
class PanJinLian implements KindWomen {
    
    public function makeEyesWithMan(){
        echo ("潘金莲抛媚眼");
    }
    
    public function happyWithMan(){
        echo ("潘金莲在和男人做那个.....");
    }
}


//再定一个丑陋的王婆:

/**
 * 王婆这个人老聪明了,她太老了,是个男人都看不上,
 * 但是她有智慧有经验呀,她作为一类女人的代理!
 */
class WangPo implements KindWomen {
    private $kindWomen;
    
    /**
     * 她可以是KindWomen的任何一个女人的代理,只要你是这一类型
     * 默认的话,是潘金莲的代理
     * @param null|KindWomen $kindWomen
     */
    public function __construct($kindWomen = null){
        if(is_object($kindWomen) || $kindWomen instanceof KindWomen){
            $this->kindWomen = $kindWomen;
        }else{
            $this->kindWomen = new PanJinLian();
        }
    }
    
    public function makeEyesWithMan(){
        $this->kindWomen->makeEyesWithMan(); //王婆这么大年龄了,谁看她抛媚眼?!    
    }
    
    public function happyWithMan() {
        $this->kindWomen->happyWithMan(); //自己老了,干不了,可以让年轻的代替
    }
}


// 两个女主角都上场了,男主角也该出现了:

/**
 * 定义一个西门庆,这人色中饿鬼
 */
class XiMenQing {
    
    /**
     * 水浒里是这样写的:西门庆被潘金莲用竹竿敲了一下难道,痴迷了,
     * 被王婆看到了, 就开始撮合两人好事,王婆作为潘金莲的代理人
     * 收了不少好处费,那我们假设一下:
     * 如果没有王婆在中间牵线,这两个不要脸的能成吗?难说的很!
     */
    public function __construct() {
        //把王婆叫出来
        $wangPo = new WangPo();
        
        //然后西门庆就说,我要和潘金莲happy,然后王婆就安排了西门庆丢筷子的那出戏:
        $wangPo->makeEyesWithMan(); //看到没,虽然表面上时王婆在做,实际上爽的是潘金莲
        echo "



";
        $wangPo->happyWithMan();
        echo "



";
        
        //改编一下历史,贾氏被西门庆勾走:
        $jiaShi = new JiaShi();
        $wangPo = new WangPo($jiaShi); //让王婆作为贾氏的代理人
        $wangPo->makeEyesWithMan();
        echo "



";
        $wangPo->happyWithMan();
        echo "



";
    }
}


/*
 * 那这就是活生生的一个例子,通过代理人实现了某种目的,如果真去掉王婆这个中间环节,直接是西
 * 门庆和潘金莲勾搭,估计很难成就武松杀嫂事件。
 * 那我们再考虑一下,水浒里还有没有这类型的女人?有,卢俊义的老婆贾氏(就是和那个固管家苟合
 * 的那个),这名字起的:“假使”,那我们也让王婆做她的代理:
 */

// 把贾氏素描出来:
class JiaShi implements KindWomen {
    
    public function makeEyesWithMan(){
        echo ("贾氏抛媚眼");
    }
    
    public function happyWithMan(){
        echo ("贾氏正在Happy中......");
    }    
}


// 西门庆勾贾氏:看上面类XiMenQing

new XiMenQing();



运行结果如下:

潘金莲抛媚眼



潘金莲在和男人做那个.....



贾氏抛媚眼



贾氏正在Happy中......









Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn