中介者模式

<?php
/*科技球和飞机场各自做自己的事情,
 *然后有其他需要对方的信息或者给对方的信息时,联系中介者
 **/

/*中介者
 *
 * 责任一:如果用户制造了科技球,接收科技球的触发信息,将科技球数量增加
 * 责任二:如果飞机场要用到科技球,会向这里发请求,询问科技球数量是不是大于0
 */
class Mediator
{
    //存放科技建筑的数量,为了简单说明,用静态属性,其实也可以让各个对象来处理
    public static $techBuilding;
    //根据参数$techBuildingName代表的建筑名称,返回是否存在相应的科技建筑,为了简单说明,用静态属性
    public static function isTechAllow ($techBuildingName)
    {
        //如果科技建筑数量大于零,就返回true,否则返回false
        return self::$techBuilding[$techBuildingName] > 0;
    }
    //一旦科技建筑造好了或者被摧毁,调用这个方法,参数$techBuildingName代表建筑名称
    //$add为布尔值,true表示增加(建造),false代表减少(摧毁)
    public static function changeTech ($techBuildingName, $add)
    {
        //建造
        if ($add)
        {
            //增加数量
            self::$techBuilding[$techBuildingName]++;
        }
        else
        {
            //减少数量
            self::$techBuilding[$techBuildingName]--;
        }
    }
}

/*科技站类
 *
 * 科技站,在每次建立时,触发中介者记录科技站的数量加1
 * 科技站,在每次摧毁时,触发中介者记录科技站的数量减1
 *
 * */

class ScienceFacility
{
    //构造方法
    public function __construct()
    {
        Mediator::changeTech('ScienceFacility', true);
    }
    //析构方法
    public function __destruct()
    {
        Mediator::changeTech('ScienceFacility', false);
    }
}

/*飞机场类
 *
 * 飞机场新建后,如果要制作科技球,就直接去问中介者,看中介记录的科技站数量是不是存在
 *
 * */
class Starport
{
    //制造科技球的方法
    public function createScienceVessel()
    {
        //询问中介者,决定是否能制造科技球
        echo Mediator::isTechAllow('ScienceFacility')?'可以制造科技球':'不能制造科技球';
    }
}



$scienceFacility1 = new ScienceFacility();//造一个科技站
$scienceFacility2 = new ScienceFacility();//再造一个科技站

$starport = new Starport();//造一个飞机场
$starport->createScienceVessel();//建造科技球,结果是能够


unset($scienceFacility1);//一个科技站被摧毁
$starport->createScienceVessel();//这时建造科技球,结果是能够,因为还有一个科技站

unset($scienceFacility2);//另一个科技站被摧毁
$starport->createScienceVessel();//这时建造科技球,结果是不行

?>

 

posted @ 2015-11-30 10:30  九分  阅读(179)  评论(0编辑  收藏  举报