小菜分享-设计模式(策略模式)--欢迎批评指点! [ 技术分享 ]
作为开发人员,需求的变更是家常便饭,前一分钟需求完成,后一分钟需求可能就被推翻了。 例如:经理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();
}
共 2 条回复
- 
 - 

菜总手打,难免有些小问题,纠了一下,感谢分享。
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(); 
灰太狼
            注册时间:2016-11-19
最后登录:2023-07-14
在线时长:76小时17分
    最后登录:2023-07-14
在线时长:76小时17分
- 粉丝28
 - 金钱3290
 - 威望150
 - 积分5550