PHP單件模式和命令鏈模式的基礎知識

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.