单件模式:单件模式结合命令链模式

  初学者对于设计模式肯定存在着很多不明白的处,今天刚好周末,就抽出来点时间写了个单件模式结合命令链模式打造系统核心文章,可能对于部分人来说,文章内容过于浅显,这是送给初学者教程,时间比较紧(要陪老婆逛街,呵呵),其中出现了设计不规范标准,代码书写不规范标准,bug等等还望各路大侠指出来,方便大家共同进步.本人水平有限.^_^

  相信大家都已经读过很多有关在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就看你自己是如何想了.)



Tags:  被套单件 命令链 单件模式类 单件模式

延伸阅读

最新评论

发表评论