zoukankan      html  css  js  c++  java
  • 中介者模式

    <?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();//这时建造科技球,结果是不行
    
    ?>
  • 相关阅读:
    ubuntu16.04左边栏图标效果设置
    VMware虚拟机 Ubuntu 16.04 安装 VMware Tools
    微信换取openid的值
    thinkphp关于T方法
    Think关于循环的事
    base64格式转换为图片
    Think视图模型格式
    thinkphp里多表事务
    ThinkPHP数据库驱动之mysql事物回滚
    webhook是啥?
  • 原文地址:https://www.cnblogs.com/jiufen/p/5006474.html
Copyright © 2011-2022 走看看