数猴子小程序(面向对象版)

/**
 *程序的实现逻辑是让猴子从队列头按顺序到指定地点报名,如果猴子安全返回则把它放到队尾。直至到最后一个。
 *程序分为3个部分:猴子的寄存器、计算器、适配器。
 * 1.猴子的寄存器
 *  属性: a.猴子队列
 *       b.计算器,猴子报名的计算器
 *       c.报名单位,猴子报名的具体位置。
 *  功能: 按需组织猴子队列,并安排猴子从队列头开始按顺序到指定地点参加报名,如果报名的猴子安全返回,则把它放到队尾等待下次报名,直至最后一个,并且能返回最后一个猴子的编号
 * 2.计算器:
 * 属性: a.累加器,接收到一个猴子,累加器+1,直到累加器的值等于指定数字,则清0.
 *       b.指定数字,确认猴子是否安全返回的数字。
 * 功能: 提供一个猴子报名的具体位置,接收猴子报名,当猴子来时,累加器+1,如果累加器的值等于指定数字,则扣留该猴子,返回空,并且初始化累加器(清0),否则“安全返回"来报名的猴子
 * 3.适配器:
 * 属性: a.实例化的猴子队列
 *       b.实例化的计算器
 * 功能: 按需要组织猴子队列和计算器,并且告知猴子队列报名的计算器和具体位置(报名单位),得到猴子队列报名后的最后一个猴子编号。
 */
/*
 *存放"猴子"的寄存器
 */
class counter
{
        //猴子队列
        var $numArr = array();
        //计算器
        var $calculator = '';
        //计算器中的具体位置(报名单位)
        var $calculatorFun = '';
	//初始化猴子队列
        function counter( $limit ){
                if($limit <= 1){
                        die($limit. ' 错误');
                }
                $this->numArr = range(1, $limit);
        }
        //设置计算器和报名单位
        function setCalculator($calculator, $function){
                $this->calculator = $calculator;
                $this->calculatorFun = $function;
        }
        //计算猴子队列中猴子的数量
        function countNum(){
                return count($this->numArr);
        }
	//报名的方法,安排猴子从队列头开始按顺序到指定地点参加报名,如果报名的猴子安全返回,则把它放到队尾等待下次报名,直至最后一个
        function traversal(){
                while($this->countNum() > 1){
                        $result = $this->calculator->{$this->calculatorFun}( array_shift($this->numArr) );
			
                        if($result != ''){
                                array_push($this->numArr, $result);
                        }
                }
        }
        //返回报名后的结果,如果还没有报名,则开始报名。
        function getResult(){
                if($this->countNum() > 1){
                        $this->traversal();
                }
		
                return array_shift($this->numArr);
        }
}

/*
 *计算器
 */
class calculator
{
        //累加器
        var $limit = 0;
        //指定数字
        var $maxNum = 0;
        //按需初始化累加器和指定数字
        function calculator( $limit ){
                $this->limit  = 0;
                $this->maxNum = $limit;
        }
	//报名单位,接收猴子报名的具体位置,当猴子来时,累加器+1,如果累加器的值等于指定数字,则扣留该猴子,返回空,并且初始化累加器(清0),否则“安全返回"来报名的猴子
        function push($num){
                $this->limit++;
                if($this->limit == $this->maxNum){
                        $this->limit = 0;
                        return '';
                }

                return $num;
        }
        //提供报名单位。
        function getFunc()
        {
                return 'push';
        }
	
}

/*
 *适配器
 */
class adapter
{
        //实例化后的猴子队列
        var $counter = '';
        //实例化后的计算器
        var $calculator = '';
        //按需组织猴子队列和计算器
        function adapter($num, $limit){
                $this->counter = new counter($num);
                $this->calculator = new calculator($limit);
	}
        //得到结果
        function getResult(){
                //告知猴子队列报名的计算器和报名单位,把得到报名单位放到适配器里是因为可以简化猴子队列的逻辑,松耦合猴子队列和计算器之间的关系,方便后期的修改以及升级。
                $this->counter->setCalculator($this->calculator, $this->calculator->getFunc() );
                //得到猴子队列报名后的结果并返回。
                return $this->counter->getResult();
        }
}

//计算
$adapter = new adapter(12, 10);
echo $adapter->getResult();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值