相信大家都已经读过很多有关在php中应用设计模式书籍或是文章,但是很少有直接给予例子,大部分看完的后有种迷迷糊糊感觉,如果没有项目实战,很难将设计模式部分弄清楚.
为避免代码过于复杂.没有添加异常处理等内容.
单件模式以及命令链模式基础知识,大家自己google下.不详细讲了.下面直接看例子:
<?php
/*
*@author:NoAngels
*@time:08年08月30日
*/
erface IRunAction{
//获取类中定义可以被APP中run思路方法
function LoadActions;
//类中入口该类中其他用
function runAction($action, $args);
}
/*
*APP类系统核心部分
*/
APP{
private $__instance = null;
private $__commands = .gif' />;
private $__flag = 1;
private function __construct{}
//单件模式设计获取该类唯例子
function Load{
(self::$__instance null) self::$__instance = APP;
self::$__instance;
}
//添加命名到APP$__instance中每次添加新命令时候检查是否的前已经添加过个该类例子
//如果有就忽略操作如果没有就添加进来
public function addCommand($cmdName){
foreach(self::$__commands as $cmd){
(strtolower(get_($cmd)) strtolower(get_($cmdName))){
self::$__flag = 0;
;
}
}
(self::$__flag 1) self::$__commands = $cmdName;
self::$__flag = 1;
}
//命令链模式设计核心部分例子入口
//首先检查是否在类中允许该操作如果没有就提示未定义操作退出
public function runCommand($action, $args){
self::$__flag = 0;
foreach(self::$__commands as $cmd){
(in_.gif' />($action, $cmd->LoadActions)){
self::$__flag = 1;
$cmd->runAction($action, $args);
}
}
(self::$__flag 0){
self::$__flag = 1;
exit("und action by action : $action");
}
}
//删除某个类例子,只要指定类名字即可
public function removeCommand($Name){
foreach(self::$__commands as $key=>$cmd){
(strtolower(get_($cmd)) strtolower($Name)){
un(self::$__commands[$key]);
}
}
}
//供大家测试用看看是否添加以及删除成功
public function viewCommands{
echo(count(self::$__commands));
}
}
//类User实现接口IRunAction
User implements IRunAction{
//定义可以操作
private $__actions = .gif' />('addUser', 'modyUser', 'removeUser');
//获取可以操作,实际过程中不要直接就爱你个$__actions设计成public
//而应该设计个LoadActions获取$__actions值
public function LoadActions{
self::$__actions;
}
//运行指定
public function runAction($action, $args){
//不明白这个使用可以参看手册
call_user_func(.gif' />($this,$action), $args);
}
//测试而已
protected function addUser($name){
echo($name);
}
}
//类Test同类User
Test implements IRunAction{
private $__actions = .gif' />('addTest', 'modyTest', 'removeTest');
public function LoadActions{
self::$__actions;
}
public function runAction($action, $args){
call_user_func(.gif' />($this,$action), $args);
}
protected function addTest($name){
echo($name);
}
}
//以下是测试代码
APP::Load->addCommand( User);
APP::Load->addCommand( User);
APP::Load->addCommand( User);
APP::Load->addCommand( User);
APP::Load->runCommand('addUser', 'NoAngels');
APP::Load->addCommand( Test);
APP::Load->runCommand('addTest', null);
APP类用单件模式设计,它是系统核心部分.相信大家看代码就知道了Load思路方法是载入APP类例子,相当于有些书籍中getInstance静态思路方法.他有addCommand,runCommand,removeCommand 3个public思路方法.runCommand是核心部分.同时也是命令链模式核心启动.具体实现请看源代码.代码写已经很清楚了,就此不再赘述.
类User,Test实现了接口IRunAction,这两个类中都定义了个静态私有变量$__actions,为,其中包含了可以被APPrunCommand操作.
下面是系统运行流程:
APP启动
-------addCommand,将将要运行操作所属类添加到APP中.如果添加类是用单件模式设计.可以如下添加addCommand(SingletonClass::Load).否则可以如下调
addCommand( someClass)
-------runCommand.运行操作.比如在User类中有操作addUser.我直接可以启用runCommand($acttion, $args).在APP中循环遍历$__commands,如果其中某个类例子拥有该操作,就该例子runAction.如果你没有将某个类例子利用addCommand添加进来,就提示未定义操作,退出.
在类User和类Test中runAction了call_user_func这个非常使用.该类中对应.
提示:讲解和例子部分就到此了,具体你如何理解,以及如何将该思想利用,就看你自己理解,凡事必须自己动手才行.(ps:可以做成框架中单入口文件,实不实现MVC就看你自己是如何想了.)
最新评论