观察者模式

≯℡__Kan透↙ 提交于 2020-03-07 00:51:14

观察者模式完美的将观察者和被观察的对象分离开。 举个例子, 用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。 一个对象只做一件事情, 并且将他做好。 观察者模式在模块之间划定了清晰的界限 ,提高了应用程序的可维护性和重用性。实现观察者模式有很多形式, 比较直观的一种是使用一种“注册——通知——撤销注册”的形式。

当管理员登录时,会自动发送邮件和记录到数据库,这两个就是观察者,而管理员登录就是被观察者。

$_login = new Login();  //被观察者
$_login->attach(new MailWarning());//注册发送邮件的观察者
$_logger = new Logger();
$_login->attach($_logger);  //注册记录到数据库的观察者
echo $_login->handleLogin('admin', '123456');  //管理员登录
<?php
//被观察者
abstract class Observable {
	abstract public function attach(Observer $_observer);			//注册观察者
	abstract public function detach(Observer $_observer);			//撤销观察者
	abstract public function notify();			//响应观察者
}//被观察者Login
class Login extends Observable {
	private $_user = 'admin';
	private $_pass = '123456';
	private $_ret;
	private $_info;
	private $_observers = array();
	public function attach(Observer $_observer) {
		$this->_observers[] = $_observer;
	}
	public function detach(Observer $_observer) {
		if (in_array($_observer, $this->_observers)) {	
			$this->_observers = array_udiff($this->_observers, array($_observer),  create_function('$a,$b', 'return ($a === $b) ? 0:1;'));
		}
	}
	public function notify() {
		foreach ($this->_observers as $_obs) {
			$_obs->update($this);
		}
	}
	public function handleLogin($_user, $_pass) {
		$this->_info = array($_user, $_pass);
		switch ($this->check($this->_info)) {
			case 1 :
				$this->_ret = true;
				break;
			case 2 :
				$this->_ret = false;
				break;
		}
		$this->notify();
		return $this->_ret;
	}
	private function check($_info) {
		if ($_info[0] == $this->_user && $_info[1] == $this->_pass) {
			return 1;
		}
		return 2;
	}
	public function getInfo() {
		return $this->_info;
	}
	
	public function getRet() {
		return $this->_ret;
	}
}
?>
<?php
//观察者类
abstract class Observer {
	abstract public function update(Observable $_observable);
}
?>
<?php
class MailWarning extends Observer {
	public function update(Observable $_observable) {
		$_info = $_observable->getInfo();
		$_ret = $_observable->getRet();
		if (!$_ret) {
			echo '发送一封邮件给总管理员:用户名:'.$_info[0].',密码:'.$_info[1].'登录错误!';
		}
	}
}
?>
<?php
class Logger extends Observer {
	public function update(Observable $_observable) {
		$_info = $_observable->getInfo();
		echo '写入数据库:用户名:'.$_info[0].',密码:'.$_info[1].'在某时某刻某地登录过!';
	}
}
?>
$_login->detach($_cookies);  //注销观察者
$_login->detach($_logger);   //注销观察者

  

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!