您的位置:首页 > 编程语言 > PHP开发

设计模式使用心得 php [二 observer]

2010-04-27 17:35 671 查看
在后台系统中,当管理员产生了一系列行为后。

当需要对管理员的行为进行日志记录,数据改变时刷生成静态文件。等一系列操作时,用观察者模式比较合适.

因为主题唯一依赖的东西是一个实现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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: