螃蟹学PHP设计模式之观察者模式

11.观察者模式

几天没学设计模式了,貌似前面学的印象不是很深了。螃蟹回忆一下,有适配器,建造者,装饰器,委托,工厂,数据访问对象,中介者,还有迭代器,外观,解释器。就是这些英文不太好记。今天要学习观察者模式了,这个模式应该也比较好理解,就如同哨兵侦查战场,发现异常情况及时反馈处理。软件开发有时候也是业务逻辑错中复杂,而且需求也是模糊变化的,一个好的程序逻辑设计会让一个中大型项目具备良好的维护性和拓展性。观察者模式在开发中使用也很多,因为很多业务不是一次性敲定,而需要一些附加功能,比如查看文章时要统计阅读量,用户登陆时保存cookie或session,我们在开发时会重点关注核心业务如何实现,而这里的统计以及cookie等的保存都属于核心业务的边缘业务,虽然也很重要。而且边缘业务是不稳定的,假如看文章又要记录访客ip信息,登录时又要重新设定cookie有效期等,这些业务就最好用观察者模式,核心业务一旦发生,立即通知观察者,观察者再统一分配处理,这样业务层就分离开了。

参考项目模块:会员登录

螃蟹就使用观察者模式来模拟用户用户登录的操作,记录用户信息到日志,并保存cookie。

使用观察者模式的用户对象:User.class.php

<?php 
class User {
	public $username = '';
	public $password = '';
	protected $_observers = array();
	
	public function __construct($user){
		$this->username = $user['username'];
		$this->password = $user['password'];
	}
	
	public function attachObserver($type,$observer){
		$this->_observers[$type][]=$observer;
	}
	
	public function notifyObserver($type){
		if(isset($this->_observers[$type])){
			foreach ($this->_observers[$type] as $observer){
				$observer->update($this);
			}
		}
	}
	
	//登录
	public function login(){
		$this->notifyObserver('login');
	}
}

?>



登录观察者:loginObserver.user.php
<?php 
require('LogsStream.user.php');
require('CookieStream.user.php');

class loginObserver{
	public function update(User $user){
		//登录成功
		echo $user->username.'<br>'.'添加到数据库<br>';
		//记录日志
		LogsStream::save($user->username);
		//保存cookie
		CookieStream::generater($user->username);
	}	
}

?>



日志记录:LogsStream.user.php
<?php 
class LogsStream{
	public static function save($username){
		echo $username.'登录信息被记录<br>';
	}
}
?>



Cookie生成:CookieStream.user.php
<?php 
class CookieStream{
	public static function generater($username){
		//生成cookie
		$_COOKIE['USERNAME'] = $username;
		echo 'cookie已经生成<br>';
	}
}

?>



编写测试类:TestObserver.php
<?php 
require('User.class.php');
require('loginObserver.user.php');

//模拟用户数据
$user = array('username'=>'螃蟹','password'=>'px123456');

//创建用户对象
$userobj = new User($user);
//创建登录观察者
$observer = new loginObserver($userobj);
//通知观察者
$userobj->attachObserver('login', $observer);
$userobj->login();
?>



测试结果:
螃蟹
添加到数据库
螃蟹登录信息被记录
cookie已经生成



现在再梳理一遍,先在对象中创建观察者,再定义与对象相关的各个观察者方法,统一用update公共方法实现,再在update方法里面实现与此操作相关的其他功能。螃蟹感觉还是有些不好理解,后面在项目中多用多想想应该会比较好理解。

你可能感兴趣的:(设计模式,PHP,观察者模式)