<?php
/**
* 观察着模式
*/
/**
定义:对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动 更新。
思想:将实际扩展操作,降低到子类
应用:登录成功后,发送邮件、写入日志
*/
//主体接口
interface Observable
{
public function attach(Observer $observer);
public function detach(Observer $observer);
public function notify();
}
//主体
class Login implements Observable
{
private $observers = array();//注册观察者
public function attach(Observer $observer)
{
$this->observers[] = $observer;
}
public function detach(Observer $observer)
{
$new_observers = array();
foreach ($this->observers as $obs) {
if ($observer !== $obs) {
$new_observers[] = $obs;
}
}
$this->observers = $new_observers;
}
/**
* 外部统一访问
*/
public function notify()
{
foreach ($this->observers as $obs) {
$obs->update($this);
}
}
// //真实登录
// public function controlLogin(){
// //登录验证
// //数据表操作
// $this->notify();
// }
}
//观察者接口
interface Observer
{
public function update(Observable $observable);
}
abstract class LoginObserver implements Observer
{
private $login = null;
public function __construct(Login $login)
{
$this->login = $login;
$login->attach($this);
}
public function update(Observable $observable)
{
if( $this->login ===$observable){
$this->doUpdate($observable);
}
}
abstract public function doUpdate(Login $login);
}
//观察者子类
class GeneralLog extends LoginObserver{
public function doUpdate(Login $login){
//$login
echo '写入日志','<br/>';
}
}
//观察者子类
class SendEmail extends LoginObserver{
public function doUpdate(Login $login){
//$login
echo '发送邮件','<br/>';
}
}
//客户端
$login = new Login();
new GeneralLog($login);
new SendEmail($login);
$login->notify();//执行观察者类中方法
?>