分享
 
 
 

单件模式结合命令链模式

王朝other·作者佚名  2008-12-19
窄屏简体版  字體: |||超大  

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

相信大家都已经读过很多关于在php中应用设计模式的书籍或是文章,但是很少有直接给予实例,大部分看完之后有种迷迷糊糊的感觉,如果没有项目实践,很难将设计模式部分弄清楚.

为避免代码过于复杂.没有添加异常处理等内容.

单件模式以及命令链模式的基础知识,大家自己google一下.不详细讲了.下面直接看实例:

<?php

/*

*@author:NoAngels

*@time:08年08月30日

*/

interface IRunAction{

//获取类中定义的可以被APP中run的方法

static function LoadActions();

//类中的入口函数调用该类中其他函数用

function runAction($action, $args);

}

/*

*APP类系统的核心部分

*/

class APP{

static private $__instance = null;

static private $__commands = array();

static private $__flag = 1;

private function __construct(){}

//单件模式设计获取该类的唯一实例

static function Load(){

if(self::$__instance == null) self::$__instance = new APP;

return self::$__instance;

}

//添加命名到APP的$__instance中每次添加新命令的时候检查是否之前已经添加过一个该类的实例

//如果有就忽略操作如果没有就添加进来

public function addCommand($cmdName){

foreach(self::$__commands as $cmd){

if(strtolower(get_class($cmd)) == strtolower(get_class($cmdName))){

self::$__flag = 0;

break;

}

}

if(self::$__flag == 1) self::$__commands[] = $cmdName;

self::$__flag = 1;

}

//命令链模式设计的核心部分调用实例的入口函数

//首先检查是否在类中允许调用该操作如果没有就提示未定义操作退出

public function runCommand($action, $args){

self::$__flag = 0;

foreach(self::$__commands as $cmd){

if(in_array($action, $cmd->LoadActions())){

self::$__flag = 1;

$cmd->runAction($action, $args);

}

}

if(self::$__flag == 0){

self::$__flag = 1;

exit("undefined action by action : $action");

}

}

//删除某个类的实例,只要指定类的名字即可

public function removeCommand($className){

foreach(self::$__commands as $key=>$cmd){

if(strtolower(get_class($cmd)) == strtolower($className)){

unset(self::$__commands[$key]);

}

}

}

//供大家测试用看看是否添加以及删除成功

public function viewCommands(){

echo(count(self::$__commands));

}

}

//类User实现接口IRunAction

class User implements IRunAction{

//定义可以调用的操作

static private $__actions = array('addUser', 'modifyUser', 'removeUser');

//获取可以调用的操作,实际过程中不要直接就爱你个$__actions设计成public调用

//而应该设计一个LoadActions函数获取$__actions的值

static public function LoadActions(){

return self::$__actions;

}

//运行指定函数

public function runAction($action, $args){

//不明白这个函数使用的可以参看手册

call_user_func(array($this,$action), $args);

}

//测试函数而已

protected function addUser($name){

echo($name);

}

}

//类Test同类User

class Test implements IRunAction{

static private $__actions = array('addTest', 'modifyTest', 'removeTest');

static public function LoadActions(){

return self::$__actions;

}

public function runAction($action, $args){

call_user_func(array($this,$action), $args);

}

protected function addTest($name){

echo($name);

}

}

//以下是测试代码

APP::Load()->addCommand(new User);

APP::Load()->addCommand(new User);

APP::Load()->addCommand(new User);

APP::Load()->addCommand(new User);

APP::Load()->runCommand('addUser', 'NoAngels');

APP::Load()->addCommand(new Test);

APP::Load()->runCommand('addTest', null);

APP类用单件模式设计,它是系统的核心部分.相信大家看代码就知道了Load方法是载入APP类实例,相当于有些书籍中的getInstance静态方法.他有addCommand,runCommand,removeCommand三个public方法.runCommand是核心部分.同时也是命令链模式的核心启动程序.具体实现请看源代码.代码写的已经很清楚了,就此不再赘述.

类User,Test实现了接口IRunAction,这两个类中都定义了一个静态私有变量$__actions,为一数组,其中包含了可以被APP的runCommand函数调用的操作.

下面是系统的运行流程:

APP启动

-------addCommand,将将要运行的操作所属的类添加到APP中.如果添加的类是用单件模式设计的.可以如下添加addCommand(SingletonClass::Load()).否则可以如下调

addCommand(new someClass)

-------runCommand.运行操作.比如在User类中有一操作addUser.我直接可以启用runCommand($acttion, $args).在APP中循环遍历$__commands数组,如果其中某个类的实例拥有该操作,就调用该实例的runAction函数.如果你没有将某个类的实例利用addCommand添加进来,就提示未定义操作,退出.

在类User和类Test中的runAction调用了call_user_func这个非常使用的函数.调用该类中对应函数.

提示:讲解与实例部分就到此了,具体你怎么理解,以及如何将该思想利用,就看你自己的理解,凡事必须自己动手才行.(ps:可以做成框架中的单一入口文件,实不实现MVC就看你自己是怎么想的了.)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有