灰太狼 2017-05-16 10:22:31 2345次浏览 2条回复 4 2 0

作为开发人员,需求的变更是家常便饭,前一分钟需求完成,后一分钟需求可能就被推翻了。 例如:经理A发布需求:动物园游戏加入新功能 ”把大象装进冰箱“。

小菜看到需求,哈哈哈哈,这么简单。 采用面向过程编码:

class AnimalGame{
    public function daxiangInDoor(){
         if(冰箱里没有大象){
             //TODO 把大象放进冰箱
             $this->pushDaxiangInBingxiang();
         }else{
             //冰箱是否装满
             if(冰箱里大象数量<=10){
                 //TODO 把大象放进冰箱
                 $this->pushDaxiangInBingxiang();
             }else{
                  echo  '这个冰箱已满,请选择其他冰箱!';
             }
         }
    }

    private function pushDaxiangInBingxiang(){
         //大象放冰箱操作
    }
}

//只用了半个小时,就提交了需求,测试并且通过了(小菜心中暗喜,太简单了)。

//下午,经理A,突然说需求有变,现在游戏升级,冰箱里不只是可以放大象,还可以放狮子和猴子, //同时,大象,狮子,猴子不只可以放进冰箱,还可以放进微波炉、洗衣机里。

//这个时候,小菜有点慌了,这要怎么判断,多种组合,要多少判断?

经理A,提示,可以使用设计模式--策略模式改。 修改代码如下:

abstruct class Animal{
    private $_dianqi;
    public function __construct(Dianqi $dianqi){
         $this->_dianqi = $dianqi;
    }
    //动物有进入冰箱,洗衣机,微波炉动作(也就是进门动作)
    public function inDoor();
    //有进就有出,
    public function outDoor();
}

class daxiang extends Animal{
    public function inDoor(){
        if($this->_dianqi->num<10){
             $this->_dianqi->jiaNum();
        }else{
           echo $this->_dianqi->name.'里的大象位置已经满了,不能再进大象了!';
        }
        echo '大象爬进'.$this->_dianqi->name;
    }
    public function outDoor(){
        echo '大象爬出'.$this->_dianqi->name;
    }
}

class shizi extends Animal{
    public function inDoor(){
        if($this->_dianqi->num<10){
            $this->_dianqi->jiaNum();
        }else{
           echo $this->_dianqi->name.'里的狮子位置已经满了,不能再进狮子了!';
        }
         echo '狮子跳进'.$this->_dianqi->name;
    }
    public function outDoor(){
         echo '狮子跳出'.$this->_dianqi->name;
    }
}

class houzi extends Animal{
    public functioin inDoor(){
        if($this->_dianqi->num<10){
           echo '猴子跳进'.$this->_dianqi->name;
        }else{
           echo $this->_dianqi->name.'里的猴子位置已经满了,不能再进猴子了!';
        }
    }
    public function outDoor(){
       echo '猴子跳出'.$this->_dianqi->name;
       $this->_dianqi->jianNum();
    }
}

//电器抽象类
abstruct class Dianqi{
   public $name;//电器名称
   public $num=0;//电器里动物数量
   public function setNum();
}

//冰箱
class bingxiang extends Dianqi{
    $this->name = '冰箱';
    public function jiaNum(){
        $this->num = $this->num+1;
    }
    public function jianNum(){
       if($this->num>0){
          $this->num = $this->num-1;
       }else{
          $this->num = 0;
       }
    }
}
//洗衣机
class xiyiji extends Dianqi{
    $this->name = '洗衣机';
    public function setNum(){
        $this->num = $this->num+1;
    }
}
//微波炉
class weibolu extends Dianqi{
    $this->name = '微波炉';
    public function setNum(){
        $this->num = $this->num+1;
    }
}

public function client(){
    //猴子进洗衣机
    $xiyiji = new xiyiji();
    $houzi = new houzi($xiyiji);
    $houzi->inDoor();
}
觉得很赞
  • 回复于 2017-05-18 16:21 举报

    楼主面向对象的思想太深刻了,佩服

  • 回复于 2017-07-07 17:02 举报

    菜总手打,难免有些小问题,纠了一下,感谢分享。
    ps:菜总怎么不更新了,这么好的东西交口称赞。

    abstract class Animal{
        protected $_dianqi;//父类参数private属性的子类不能使用
        public function __construct(Dianqi $dianqi){
             $this->_dianqi = $dianqi;
        }
        //动物有进入冰箱
        abstract function inDoor();
        //有进就有出,
        abstract function outDoor();
    }
    
    class houzi extends Animal{
        public function inDoor(){
            if($this->_dianqi->num<10){
    		   $this->_dianqi->jiaNum();
               echo '猴子跳进'.$this->_dianqi->name.',目前共有猴子数量是:'.$this->_dianqi->num;
            }else{
               echo $this->_dianqi->name.'里的猴子位置已经满了,不能再进猴子了!';
            }
        }
        public function outDoor(){
           echo '猴子跳出'.$this->_dianqi->name;
           $this->_dianqi->jianNum();
        }
    }
    
    
    //电器抽象类
    abstract class Dianqi{
       public $name;//电器名称
       public $num=0;//电器里动物数量
       abstract function jiaNum();
       abstract function jianNum();
    }
    
    
    //洗衣机
    class xiyiji extends Dianqi{
    	public function __construct(){
    		$this->name = '洗衣机';
    	}
        
        public function jiaNum(){
            $this->num = $this->num+1;
        }
    	public function jianNum(){
            $this->num = $this->num-1;
        }
    }
    
    //猴子进洗衣机
    $xiyiji = new xiyiji();
    $houzi = new houzi($xiyiji);
    $houzi->inDoor();
    
您需要登录后才可以回复。登录 | 立即注册