首页 > 开发 > PHP > 正文

轻松掌握php设计模式之访问者模式

2024-05-04 22:52:33
字体:
来源:转载
供稿:网友

访问者模式解决的问题

在我们的代码编写过程当中,经常需要对一些类似的对象添加一些的代码,我们以一个计算机对象打印组成部分为例来看下:

  /**  * 抽象基类  */  abstract class Unit  {    /**    *获取名称    */    abstract public function getName();  }  /**  * Cpu类  */  class Cpu extends Unit  {    public function getName()    {      return 'i am cpu';    }  }  /**  * 内存类  */  class Memory extends Unit  {    public function getName()    {      return 'i am memory';    }  }  /**  * 键盘类  */  class Keyboard extends Unit  {    public function getName()    {      return 'i am keyboard';    }  }  /**  * 计算机类  */  class Computer  {    protected $_items = [];    public function add(Unit $unit)    {      $this->_items[] = $unit;    }    public function print()    {      // 循环打印各个组成部分      foreach ($this->_items as $item) {        $item->getName();      }    }  }


这个时候上面的代码看上去好像很完美的样子,但是问题来了,现在我们不但需要打印组成部分,还需要保存各个组件到数据库,不仅如此,还需要打印各个组件的价格;此时如果在Unit基类中添加getPrice()和save()方法,也能实现我们想要的功能,但是这样做也存在问题,你并不知道还需要新增什么操作,如果每新增一个操作都用这样的方法来新增,我们的类会变得越来越臃肿。

访问者模式的实现

而访问者模式就是为了解决这个问题的,他把数据结构和作用于结构之上的操作之间的耦合解脱开,使得操作集合可以相对自由的演化,我们来看下面改良过得代码:

  /**  * 抽象基类  */  abstract class Unit  {    /**    * 获取名称    */    abstract public function getName();    /**    * 用来接受访问者对象,回调访问者的visit方法    * 非常关键的方法    */    public function accept(Visitor $visitor)    {      $method = visit . get_class($this);      if (method_exists($visitor, $method)) {        $visitor->$method($this);      }    }  }  /**  * Cpu类  */  class Cpu extends Unit  {    public function getName()    {      return 'i am cpu';    }  }  /**  * Memory类  */  class Memory extends Unit  {    public function getName()    {      return 'i am memory';    }  }  /**  * Keyboard类  */  class Keyboard extends Unit  {    public function getName()    {      return 'i am keyboard';    }  }    /**  * Keyboard类  */  interface Visitor  {    public function visitCpu(Cpu $cpu);    public function visitMemory(Memory $memory);    public function visitKeyboard(Keyboard $keyboard);  }  /**  *   */  class PrintVisitor implements Visitor  {    public function visitCpu(Cpu $cpu)    {      echo "hello, " . $cpu->getName() . "/n";    }    public function visitMemory(Memory $memory)    {      echo "hello, " . $memory->getName() . "/n";    }    public function visitKeyboard(Keyboard $keyboard)    {      echo "hello, " . $keyboard->getName() . "/n";    }  }  /**  *   */  class Computer  {    protected $_items = [];    public function add(Unit $unit)    {      $this->_items[] = $unit;    }        /**    * 调用各个组件的accept方法    */    public function accept(Visitor $visitor)    {      foreach ($this->_items as $item) {        $item->accept($visitor);      }    }  }  $computer = new Computer();  $computer->add(new Cpu());  $computer->add(new Memory());  $computer->add(new Keyboard());  $printVisitor = new PrintVisitor();  $computer->print($printVisitor);  // 以上的代码将打印出    hello, i am cpu  hello, i am memory  hello, i am keyboard            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表