亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

PHP單件模式結合命令鏈模式

2020-03-24 17:06:15
字體:
來源:轉載
供稿:網友
初學者對于設計模式肯定存在著很多不明白之處,今天剛好周末,就抽出來點時間寫了一個單件模式結合命令鏈模式打造系統核心的文章,可能對于部分人來說,文章內容過于淺顯,這是送給初學者的教程,因為時間比較緊(要陪老婆逛街,呵呵),其中出現了設計不規范的,代碼書寫不規范的,bug等等還望各路大俠指出來,方便大家共同進步.本人水平有限.^_^相信大家都已經讀過很多關于在php中應用設計模式的書籍或是文章,但是很少有直接給予實例,大部分看完之后有種迷迷糊糊的感覺,如果沒有項目實踐,很難將設計模式部分弄清楚.為避免代碼過于復雜.沒有添加異常處理等內容.
單件模式以及命令鏈模式的基礎知識,大家自己google一下.不詳細講了.下面直接看實例: ?php
/*
*@author:NoAngels
*@time:08年08月30日
*/
interface IRunAction{
//獲取類中定義的可以被APP中run的方法
html' target='_blank'>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就看你自己是怎么想的了.)實際運行效果如下:限于語文水平,有什么不理解的可以聯系我.
以后有時間了再給大家寫點文章.html教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕日韩欧美在线| 亚洲男人第一av网站| 成人女保姆的销魂服务| 精品亚洲精品福利线在观看| 不卡av在线播放| 国产一区二区成人| 亚洲免费av网址| 亚洲欧美综合精品久久成人| 国产91精品在线播放| 国产精品一区专区欧美日韩| 日本亚洲欧洲色α| 精品成人69xx.xyz| 俺去亚洲欧洲欧美日韩| 欧美猛男性生活免费| 日韩av片电影专区| 日韩视频亚洲视频| 欧美极品第一页| 亚洲欧美综合精品久久成人| 亚洲香蕉伊综合在人在线视看| 欧美亚洲另类制服自拍| 国产精品美女主播在线观看纯欲| 欧美性猛交xxxx富婆弯腰| 国内久久久精品| 亚洲a在线播放| 97香蕉久久超级碰碰高清版| 欧美激情乱人伦一区| 啊v视频在线一区二区三区| 成人精品在线视频| 久久久久久久久久久人体| 欧美中文字幕在线| 亚洲大胆人体视频| 国产精品亚洲激情| 午夜精品久久久99热福利| 亚洲自拍在线观看| 日韩免费不卡av| 最新日韩中文字幕| 青青草一区二区| 8090成年在线看片午夜| 91九色视频导航| 国产精品高清网站| www.日韩系列| 隔壁老王国产在线精品| 欧美有码在线观看视频| 久久久伊人欧美| 91精品国产自产在线观看永久| 在线免费观看羞羞视频一区二区| 性欧美视频videos6一9| 亚洲免费中文字幕| 国产97色在线| www.xxxx精品| 久久久久久久久中文字幕| 日韩资源在线观看| 911国产网站尤物在线观看| 在线观看日韩欧美| 久久久之久亚州精品露出| 久久99亚洲精品| 亚洲午夜未删减在线观看| 亚洲精品视频播放| 欧美日韩国产精品一区| 日韩在线不卡视频| 色777狠狠综合秋免鲁丝| 欧美激情免费观看| 日韩激情视频在线播放| 亚洲成人久久网| 色噜噜亚洲精品中文字幕| 亚洲一区久久久| 成人亚洲激情网| 日本国产一区二区三区| 国产亚洲精品91在线| 亚洲精品久久7777777| 亚洲tv在线观看| 久久精品成人欧美大片古装| 欧美交受高潮1| 成人a在线观看| 韩日欧美一区二区| 91福利视频在线观看| 久久国产精品久久国产精品| 国产精欧美一区二区三区| 亚洲欧美国产日韩天堂区| 高清欧美性猛交xxxx黑人猛交| 性色av一区二区三区| 91久久在线播放| 91免费精品视频| 欧美成人免费视频| 欧美黄色片免费观看| 久久99热精品这里久久精品| 青青a在线精品免费观看| 亚洲国产91精品在线观看| 国产精品福利在线观看网址| 国内精品久久久久久中文字幕| 亚洲欧美国产一本综合首页| 亚洲视频国产视频| 欧美一级视频一区二区| 国产精品男女猛烈高潮激情| 日本一区二区三区四区视频| 亚洲影院在线看| 精品国产一区二区三区四区在线观看| 精品国产一区二区三区久久狼5月| 日韩中文第一页| 欧美巨大黑人极品精男| 欧美成人剧情片在线观看| 欧美孕妇孕交黑巨大网站| 国产va免费精品高清在线观看| 性日韩欧美在线视频| 日韩av在线看| 激情成人在线视频| 91亚洲精品在线观看| 日韩成人免费视频| 日韩中文字幕网| 一本色道久久88精品综合| 亚洲a在线播放| 国产成人亚洲综合91| 在线亚洲欧美视频| 日韩在线观看免费| 午夜精品美女自拍福到在线| 久久久免费精品| 国产一区二区三区18| 亚洲综合中文字幕在线| 亚洲乱码一区二区| 亚洲欧洲免费视频| 欧美精品少妇videofree| 国产精品视频网站| 在线视频精品一| 亚洲人在线视频| 欧美国产一区二区三区| 大胆欧美人体视频| 2019中文字幕在线观看| 成人欧美在线视频| 欧美性色19p| 国产精品成人aaaaa网站| 97人人爽人人喊人人模波多| 国产精品视频免费在线| 亚洲成人在线网| 亚洲视频在线观看| 精品福利免费观看| 主播福利视频一区| 中文字幕视频在线免费欧美日韩综合在线看| 国产精品稀缺呦系列在线| 亚洲精品国产品国语在线| 国产精品久久久一区| 亚洲另类激情图| 国产精品狼人色视频一区| 2021国产精品视频| 青青a在线精品免费观看| 国产精品∨欧美精品v日韩精品| 97精品国产97久久久久久春色| 国产精品成人免费电影| 色偷偷偷综合中文字幕;dd| 日韩免费在线看| 北条麻妃在线一区二区| 国产欧美日韩丝袜精品一区| 久久免费国产视频| 亚洲自拍在线观看| 成人97在线观看视频| 久久亚洲精品成人| 欧美精品成人在线| 国产精品久久久久久久天堂| 日本久久亚洲电影| 国产精品久久一| 欧美乱妇高清无乱码| 俺也去精品视频在线观看| 中文字幕亚洲在线| 中文字幕欧美亚洲| 最近2019年中文视频免费在线观看|