信息爆炸的今天,根据自己的爱好去订阅相关的信息是很有必要的。
今天我们就来演示如何用观察者模式来实现订阅消息的更新推送。
首先我们定义一个主题(抽象通知者)抽象类:
abstract class theme{
protected $themeName;
protected $subscriber=array();
function addSubscriber(subscriber $sub){
$this->subscriber[]=$sub;
}
function removeSubscriber(subscriber $sub){
$temp=array();
foreach($this->subscriber as $value){
if($value != $sub){
$temp[]=$value;
}
}
$this->subscriber=$temp;
}
function notify(){
foreach($this->subscriber as $value){
$value->update($this->themeName);
}
}
}
然后定义一些主题如下:
class IT extends theme{
function __construct(){
$this->themeName='IT';
}
//包含IT主题独有的一些特定信息
......................
}
class sports extends theme{
function __construct(){
$this->themeName='sports';
}
//包含体育主题独有的一些特定信息
......................
}
接着定义订阅者(抽象观察者)接口:
interface subscriber{
function update($name);
}
再来定义几个订阅者(具体观察者)
class changeUI implements subscriber{
private $myTheme;
function update($name){
echo "$name主题消息已更新,将会自动更新界面<br>";
}
}
class remind implements subscriber{
private $myTheme;
function update($name){
echo "$name主题消息已更新,自动弹框提醒";
}
}
客户端代码:
//实例化主题对象
$themeIT=new IT();
$themeSports=new sports();
//实例化订阅者
$ui=new changeUI();
$remind=new remind();
//设置IT消息更新时弹框通知并且刷新界面,体育消息更新时仅刷新界面
$themeIT->addSubscriber($ui);
$themeIT->addSubscriber($remind);
$themeSports->addSubscriber($ui);
$themeIT->notify();
$themeSports->notify();
总结
观察者模式定义了一种一对多的依赖关系,让多个观察者同时监听一个主题,当主题发生改变时,通知所有观察者实现更新。