设计模式使用心得 php [二 observer]
2010-04-27 17:35
671 查看
在后台系统中,当管理员产生了一系列行为后。
当需要对管理员的行为进行日志记录,数据改变时刷生成静态文件。等一系列操作时,用观察者模式比较合适.
因为主题唯一依赖的东西是一个实现observer 接口的对象列表,我们可以随时增加观察者,甚至在运行时,使用新的观察者取代旧的观察者,而主题不受影响。
当有新的观察者出现时,主题代码不需要修改。主题不在乎别的,只会发送通知给所有实现了观察者接口的对象. 我们可以独立的复用主题或观察者,如果我们在其它地方,需要使用主题或者观察者,可以轻易的复用,因为二者并非紧耦合。
这里管理员的行为,就是主题.
日志,生成静态,等关注管理员行为产生后的东东就是观察者了。
观察者:
主题
然后写一个数据库的日志 记录。
当需要对管理员的行为进行日志记录,数据改变时刷生成静态文件。等一系列操作时,用观察者模式比较合适.
因为主题唯一依赖的东西是一个实现observer 接口的对象列表,我们可以随时增加观察者,甚至在运行时,使用新的观察者取代旧的观察者,而主题不受影响。
当有新的观察者出现时,主题代码不需要修改。主题不在乎别的,只会发送通知给所有实现了观察者接口的对象. 我们可以独立的复用主题或观察者,如果我们在其它地方,需要使用主题或者观察者,可以轻易的复用,因为二者并非紧耦合。
这里管理员的行为,就是主题.
日志,生成静态,等关注管理员行为产生后的东东就是观察者了。
观察者:
interface iobserver { function update($sender,$args); } /** * 数据库日志观察者 */ class dblog_ob implements iobserver{ function update($sender,$args){ $CI = &get_instance(); $model_name = CS_get_model_name("ylog"); $CI->load->model($model_name); //载入后台用户模型 $data["ylog_cate"] = $args["action"]; $data["ylog_vtitle"] = $args["session"]->user_username; $data["ylog_title"] = $sender["title"]; $data["ylog_cid"] = $sender["ylog_cid"]; $data["ylog_info"] = $sender["info"]; $CI->$model_name->insert($data); } } /** * 文本日志观察者 * */ class log_ob implements iobserver{ function update($sender,$args){ $log_file = $_SERVER['DOCUMENT_ROOT']."/logs/".$args[action].date("Y-m-dH").".html"; $text = "{action:$args[action],adminName:".$args["session"]->user_username.",title:$sender[title],info:$sender[info]}"; CS_log($text,$log_file); } } /** * *刷my fav 数据 */ class make_fav implements iobserver { function update($sender,$args) { //某生成静态的代码,约100行. } /** * * * * @param 将表达式解析 $str * @return 解析后的表达式的值 */ function get_eval($str) { return eval($str); } } /**生成top*/ class maketop implements iobserver { function update($sender,$args){ //某生成静态的代码,约150行. } } class make_left { static $left_bar = "outlookbar=new outlook(); var t;"; //CI对象的实例 function update($sender,$args){ //某生成静态的代码,约150行. $CI = &get_instance(); $roles = $CI->config->item("roles"); $CI->load->helper("file"); foreach ($roles as $key=>$val): $this->left_bar = "outlookbar=new outlook(); var t;"; //CI对象的实例 $left_bar = $this->make_leftbar(0,$key); $data["left_bar"] = $left_bar; $cont = $CI->load->view("admin/left",$data,true); $dest_path_dir = $_SERVER['DOCUMENT_ROOT']."/system/application/views/admin/nav/"; $dest_file = $dest_path_dir."left_nav".$key.".php"; write_file($dest_file, $cont, 'w+'); endforeach; } function make_leftbar($id,$role_id = 0) { $CI = &get_instance(); if(!$id) $id = 0; $where = "menu_pid = $id"; $model_name = CS_get_model_name("menu"); //取得模型名称 $CI->load->model($model_name); //加载模型 $where = "menu_pid = $id"; $rows = $CI->$model_name->get($where,1000,0,"menu_id"); foreach ($rows as $key=>$val) { $dest_url = '$t = '.$val->menu_url.'; return $t;'; $url = $this->get_eval($dest_url); if($val->menu_pid ==0 ) { if($role_id == 1 ||in_array($role_id,explode(",",$val->menu_descript))) { $this->left_bar .= "t=outlookbar.addtitle('$val->menu_title','$val->menucate_title',1);"; } }else { if($role_id == 1 ||in_array($role_id,explode(",",$val->menu_descript))) { $this->left_bar .= "outlookbar.additem('$val->menu_title',t,'$url');"; } } $this->make_leftbar($val->menu_id,$role_id); } return $this->left_bar; } /** * * * * @param 将表达式解析 $str * @return 解析后的表达式的值 */ function get_eval($str) { return eval($str); } }
主题
/*** * 主题 */ abstract class subject { public $ob_array; public $sender; public $args; function addOb($ob) { $this->ob_array[]=$ob; } function set_obj($obj,$args = array("")) { $this->sender = $obj; $this->args = $args; } function delOb($ob) { } function notify() { foreach ($this->ob_array as $val) { $val->update($this->sender,$this->args); } } } /** * * 管理员行为主题 * */ class adminAction extends subject { function adminAction() { $this->addOb(new log_ob()); } }
然后写一个数据库的日志 记录。
/** * * * * @param 标题 $title * @param 数据 $data * @param 类别 $cid * @param 处理表格 $table * @param 行为 $action * @param 观察者列表 $array_observer */ function log_db($title,$data,$cid,$table,$action,$array_observer = array('')) { load_class("ob"); //加载字段类 $me = new adminAction(); $me->addOb(new dblog_ob()); if(is_array($array_observer) && sizeof($array_observer)) { foreach ($array_observer as $observer) { $me->addOb(new $observer()); } } $sender["table"] = $table; $sender["ylog_cid"] = $cid; $sender["title"] = "<font color = 'blue'>".$_SESSION['admin_user_data']->user_username."</font>于".date("Y-m-d H:i:s")."<font color=green>$title</font>"; foreach ( $data as $key=>$val): $str_data_array[]="$key=>$val"; endforeach; $str_data = implode(",",$str_data_array); $sender["info"] = "$str_data"; $me->set_obj($sender,array("action"=>"$action","session"=>$_SESSION['admin_user_data'])); $me->notify(); }
相关文章推荐
- php设计模式之命令模式使用示例
- 设计模式使用心得
- C#设计模式之十九:Observer模式(使用委托、事件)
- php使用接口实现工厂设计模式
- PHP设计模式笔记:使用PHP实现适配器模式
- 使用Micrisoft.net设计方案 第三章Web表示模式 Web模式集群详细介绍 Observer(观察器)
- php设计模式 Observer(观察者模式)
- php设计模式 Observer(观察者模式)
- 设计模式 - 观察者模式(Observer Pattern) Java内置 使用方法
- Observer 设计模式 了解委托与事件的使用
- php设计模式之单例模式使用示例
- PHP设计模式之观察者模式(Observer)详细介绍和代码实例
- PHP设计模式之观察者模式(Observer)详细介绍和代码实例
- php 设计模式使用场景分析
- 设计模式 - 观察者模式(Observer Pattern) Java内置 使用方法
- php中使用接口实现工厂设计模式的代码
- PHP 面向对象编程和设计模式 (5/5) - PHP 命名空间的使用及名称解析规则
- php 设计模式(注册器模式+工厂模式+数据库映射模式,单例模式+工厂模式+注册器模式混合使用)
- php 设计模式 观察者observer模式
- php中迭代接口的使用,算不上设计模式