У новичков, должно быть, много путаницы в отношении шаблонов проектирования. Сегодня выходные, поэтому я потратил некоторое время на написание статьи о режиме отдельных частей в сочетании с режимом цепочки команд для создания ядра системы. Возможно, для некоторых людей — контента. статья слишком простая, это туториал для новичков, так как времени мало (надо ходить по магазинам с женой, хаха), есть неточности в дизайне, неточности в написании кода, баги и т.д. Надеюсь все. герои могут указать на них для удобства. Давайте вместе добиваться прогресса. Мой уровень ограничен.^_^
Я считаю, что все читали много книг или статей о применении шаблонов проектирования в PHP, но лишь немногие из них прямо приводят примеры. после их прочтения я чувствую, что без практики проекта трудно разобраться в части шаблона проектирования.
Чтобы избежать слишком сложного кода, обработка исключений и другое содержимое не добавляются.
Базовые знания о режиме Singleton и режиме цепочки команд вы можете получить самостоятельно, не буду вдаваться в подробности:
<?php.
/*
*@author:NoAngels
*@time: 30 августа 2008 г.
*/
интерфейсIRunAction{
//Получаем методы, определенные в классе, которые можно запустить в приложении
статическая функция LoadActions();
//Функция входа в класс используется для вызова других функций класса
функция runAction($action, $args);
}
/*
* Основная часть системы приложений
*/
классAPP{
статический частный $__instance = null;
статический частный $__commands = массив();
статический частный $__flag = 1;
частная функция __construct(){}
//При проектировании одиночного режима используется единственный экземпляр этого класса
статическая функция Load(){
если (self::$__instance == null) self::$__instance = новое приложение;
вернуть себя::$__instance;
}
//Добавление имени к $__instance APP. Каждый раз, когда вы добавляете новую команду, проверяйте, был ли добавлен экземпляр этого класса ранее.
//Если есть, игнорируем операцию. Если нет, добавляем ее.
общественная функция addCommand($cmdName){
foreach(self::$__commands как $cmd){
if(strtolower(get_class($cmd)) == strtolower(get_class($cmdName))){
self::$__flag = 0;
перерыв;
}
}
if(self::$__flag == 1) self::$__commands[] = $cmdName;
self::$__flag = 1;
}
//Основная часть конструкции режима цепочки команд вызывает функцию входа экземпляра
//Сначала проверяем, разрешен ли вызов этой операции в классе. Если нет, будет предложена неопределенная операция и произойдет выход.
общественная функция runCommand($action, $args){
self::$__flag = 0;
foreach(self::$__commands как $cmd){
if(in_array($action, $cmd->LoadActions())){
self::$__flag = 1;
$cmd->runAction($action, $args);
}
}
if(self::$__flag == 0){
self::$__flag = 1;
exit("неопределенное действие за действием: $action");
}
}
//Чтобы удалить экземпляр класса, просто укажите имя класса.
общественная функция RemoveCommand($className){
foreach(self::$__commands as $key=>$cmd){
if(strtolower(get_class($cmd)) == strtolower($className)){
unset(self::$__commands[$key]);
}
}
}
//Для всеобщего тестирования, чтобы убедиться в успешности добавления и удаления
публичная функция viewCommands(){
echo(count(self::$__commands));
}
}
//Класс User реализует интерфейс IRunAction
класс User реализует IRunAction{
//Определяем операции, которые можно вызвать
статический частный $__actions = array('addUser', 'modifyUser', 'removeUser');
//Получаем операции, которые можно вызвать. В реальном процессе $__actions предназначен не только для публичного вызова.
//Вам следует разработать функцию LoadActions, чтобы получить значение $__actions
статическая публичная функция LoadActions(){
вернуть себя::$__actions;
}
//Запускаем указанную функцию
публичная функция runAction($action, $args){
//Если вы не понимаете, как использовать эту функцию, обратитесь к руководству.
call_user_func(массив($this,$action), $args);
}
//Просто тестовая функция
защищенная функция addUser($name){
эхо ($ имя);
}
}
//Тестовый пользователь
класс Test реализует IRunAction{
статический частный $__actions = array('addTest', 'modifyTest', 'removeTest');
статическая публичная функция LoadActions(){
вернуть себя::$__actions;
}
публичная функция runAction($action, $args){
call_user_func(массив($this,$action), $args);
}
защищенная функция addTest($name){
эхо ($ имя);
}
}
//Ниже приведен тестовый код
APP::Load()->addCommand(новый пользователь);
APP::Load()->addCommand(новый пользователь);
APP::Load()->addCommand(новый пользователь);
APP::Load()->addCommand(новый пользователь);
APP::Load()->runCommand('addUser', 'NoAngels');
APP::Load()->addCommand(новый тест);
APP::Load()->runCommand('addTest', null);
Класс APP разработан в одноэлементном режиме, который, я думаю, вы поймете, посмотрев код, что представляет собой метод Load. для загрузки экземпляра класса APP, который эквивалентен статическому методу getInstance в некоторых книгах, имеет три общедоступных метода: addCommand, runCommand и removeCommand. runCommand также является основной программой запуска режима цепочки команд. см. исходный код конкретной реализации. Код написан очень понятно, не буду здесь вдаваться в подробности.
Классы User и Test реализуют интерфейс IRunAction. Оба класса определяют статическую частную переменную $__actions, которая представляет собой массив, содержащий операции, которые могут быть вызваны функцией runCommand приложения.
Ниже приведен запущенный процесс системы:
Запуск приложения.
-------addCommand, добавьте класс, которому принадлежит выполняемая операция, в приложении. Если добавленный класс разработан с использованием одноэлементного режима, вы можете добавить addCommand(SingletonClass::Load()) следующим образом. В противном случае вы можете добавить его следующим образом. Вызов
addCommand(new someClass)
-------runCommand. Запуск операций. Например, в классе User есть операция addUser, я могу напрямую включить runCommand($acttion, $args). является экземпляром одного из классов. Если у вас есть эта операция, вызовите функцию runAction экземпляра. Если вы не добавите экземпляр определенного класса с помощью addCommand, вам будет предложено выполнить неопределенную операцию и выйти.
RunAction в классе User и классе Test вызывает call_user_func, очень часто используемую функцию.
Совет: это конец объяснений и примеров. Просто посмотрите. Вы сами понимаете, что вам придется делать все самостоятельно (ps: это можно сделать в виде одного файла записи в рамках. Реализовывать MVC или нет, зависит от того, что вы думаете.)