/**
*程序的实现逻辑是让猴子从队列头按顺序到指定地点报名,如果猴子安全返回则把它放到队尾。直至到最后一个。
*程序分为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();
数猴子小程序(面向对象版)
最新推荐文章于 2023-01-12 11:36:53 发布