<?php abstract class Subject { abstract public function addObj(User $u); //增加用户 abstract public function removeObj(User $u); //移除用户 abstract public function notify(); //通知用户 } interface DisplayElement { public function display(); } interface User { //当这三个值改变时,Subject 会把这些状态值当作方法的参数,传递给观察者 public function update($name,$url,$comment); } class Office extends Subject { private $users = array(); private $name; private $url; private $comment; public function addObj(User $u){ $this->users[] = $u; } public function removeObj(User $u){ //判断$u是否存在于$users数组中 $key = array_search($u,$this->users); if(false !== $key){ unset($this->users[$key]); } } //更新每个观察者的显示数据 public function notify(){ foreach($this->users as $key=>$val){ $val->update($this->name,$this->url,$this->comment); } } //数据更新 public function dataChange(){ $this->notify(); } //设置数据 public function setData($name,$url,$comment){ $this->name = $name; $this->url = $url; $this->comment = $comment; $this->dataChange(); } } /* * User1为一个观察者 */ class User1 implements User,DisplayElement { public $offdata; private $name; private $url; private $comment; public function __construct(Office $offdata){ $this->offdata = $offdata; $this->offdata->addObj($this); } public function update($name,$url,$comment){ $this->name = $name; $this->url = $url; $this->comment = $comment; $this->display(); } public function display(){ echo 'name = '.$this->name.'<br />'; echo 'url = '.$this->url.'<br />'; echo 'comment = '.$this->comment.'<br />'; } } /* * User2为一个观察者 */ class User2 implements User,DisplayElement { public $offdata; private $name; private $url; private $comment; public function __construct(Office $offdata){ $this->offdata = $offdata; $this->offdata->addObj($this); } public function update($name,$url,$comment){ $this->name = $name; $this->url = $url; $this->display(); } public function display(){ echo 'name = '.$this->name.'<br />'; echo 'url = '.$this->url.'<br />'; } } $a=new Office();//先实例一个对象。一个神诞生了。他能给我们新闻 $u1 = new User1($a);//把WebBrowser对象实例化并且注册给这个主题; $u2 = new User2($a); $a->setData('gg','http://g.cn','google'); echo '-------------------<br/>'; ?>