初學者對於設計模式肯定存在著很多不明白之處,今天剛好周末,就抽出來點時間寫了一個單件模式結 合命令鏈模式打造系統核心的文章,可能對於部分人來說,文章內容過於淺顯,這是送給初學者的教程,因為 時間比較緊(要陪老婆逛街,呵呵),其中出現了設計不規范的,代碼書寫不規范的,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);
}
}