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