访问者模式构造了包含某个算法截然不同的对象, 访问者模式的一个主要优点是能够在不更改对象的情况下就向该对象添加新的功能。
class Blog { private $_user; private $_date; public function __construct($_user, $_date) { $this->_user = $_user; $this->_date = $_date; } public function __get($_key) { return $this->$_key; } public function addBlog() { return $this->_user.'于'.$this->_date.'发表了一篇博文!'; } //创建一个新增功能的访问入口 public function visit(L $_l) { return $_l->get($this); } }
abstract class L { abstract public function get(Blog $_blog); } class Title extends L { private $_title; public function __construct($_title) { $this->_title = $_title; } public function get(Blog $_blog) { return $_blog->_user.'发表的的博文的标题是:'.$this->_title; } }
$_blog1 = new Blog('Lee', '2012年2月1日'); echo $_blog1->addBlog(); echo '<br />'; echo $_blog1->visit(new Title('Javascript 与 php'));
不需要对 Blog 进行修改,而只是增加一个访问者入口的方法, 然后通过一个单独的类来封装算法。 这样大大的提高了扩展性和维护性,从而不会对已存在的代码造成连锁反应。