초보자분들은 디자인 패턴에 대해 많이 헷갈리실 텐데요. 오늘은 주말이라 시스템의 핵심이 되는 커맨드 체인 모드와 결합된 싱글피스 모드에 대한 글을 작성해봤습니다. 글의 내용이 너무 간단합니다. 초보자를 위한 튜토리얼입니다. 시간이 촉박하고(아내와 쇼핑하러 가야 하거든요, ㅎㅎ), 디자인의 불규칙성, 코드 작성의 불규칙성, 버그 등이 있습니다. 영웅들은 편의상 지적할 수 있습니다. 함께 발전해 봅시다. 제 레벨은 제한되어 있습니다.^_^
PHP에 디자인 패턴을 적용하는 방법에 대한 많은 책이나 기사를 읽어 보셨을 거라 생각하지만, 대부분은 직접적으로 예제를 제시합니다. 프로젝트 실습 없이는 디자인 패턴 부분을 파악하기가 어렵다는 느낌이 들었습니다.
코드가 너무 복잡해지는 것을 피하기 위해 예외 처리 및 기타 내용이 추가되지 않았습니다.
싱글톤 모드와 명령 체인 모드에 대한 기본 지식은 직접 Google에서 확인할 수 있습니다. 자세한 내용은 직접 살펴보겠습니다.
<?php
/*
*@author:NoAngels
*@시간: 2008년 8월 30일
*/
인터페이스IRunAction{
//APP에서 실행할 수 있는 클래스에 정의된 메소드를 가져옵니다.
정적 함수 LoadActions();
//클래스의 진입 함수는 클래스의 다른 함수를 호출하는 데 사용됩니다.
함수 runAction($action, $args);
}
/*
*APP 시스템의 핵심 부분
*/
클래스앱{
정적 개인 $__인스턴스 = null;
정적 개인 $__명령 = array();
정적 개인 $__flag = 1;
비공개 함수 __construct(){}
//단일 조각 모드 디자인은 이 클래스의 유일한 인스턴스를 얻습니다.
정적 함수 로드(){
if(self::$__instance == null) self::$__instance = 새 앱;
return self::$__인스턴스;
}
//APP의 $__instance에 이름을 추가합니다. 새 명령을 추가할 때마다 이 클래스의 인스턴스가 이전에 추가되었는지 확인합니다.
//있는 경우 해당 작업을 무시합니다. 없으면 추가합니다.
공용 함수 addCommand($cmdName){
foreach(self::$__$cmd로 명령){
if(strtolower(get_class($cmd)) == strtolower(get_class($cmdName))){
self::$__플래그 = 0;
부서지다;
}
}
if(self::$__flag == 1) self::$__commands[] = $cmdName;
self::$__flag = 1;
}
//명령 체인 모드 설계의 핵심 부분은 인스턴스의 진입 기능을 호출합니다.
//먼저 클래스에서 이 작업 호출이 허용되는지 확인합니다. 그렇지 않으면 정의되지 않은 작업이 프롬프트되고 종료됩니다.
공개 함수 runCommand($action, $args){
self::$__플래그 = 0;
foreach(self::$__$cmd로 명령){
if(in_array($action, $cmd->LoadActions())){
self::$__flag = 1;
$cmd->runAction($action, $args);
}
}
if(self::$__flag == 0){
self::$__flag = 1;
exit("액션별로 정의되지 않은 액션 : $action");
}
}
//클래스의 인스턴스를 삭제하려면 클래스 이름을 지정하면 됩니다.
공개 함수 제거명령($className){
foreach(self::$__명령은 $key=>$cmd로){
if(strtolower(get_class($cmd)) == strtolower($className)){
unset(self::$__명령[$key]);
}
}
}
//추가 및 삭제가 성공했는지 모든 사람이 테스트하기 위해
공개 함수 viewCommands(){
echo(count(self::$__명령));
}
}
//클래스 사용자가 인터페이스 IRunAction을 구현합니다.
클래스 사용자가 IRunAction을 구현합니다.{
//호출할 수 있는 작업 정의
static private $__actions = array('addUser', 'modifyUser', 'removeUser');
//실제 프로세스에서 호출할 수 있는 작업을 가져옵니다. $__actions는 공개 호출로 설계되었습니다.
//$__actions 값을 얻으려면 LoadActions 함수를 설계해야 합니다.
정적 공개 함수 LoadActions(){
return self::$__actions;
}
//지정된 함수 실행
공개 함수 runAction($action, $args){
//이 기능의 사용법이 이해가 되지 않는다면 매뉴얼을 참고하시기 바랍니다.
call_user_func(array($this,$action), $args);
}
//그냥 테스트 함수
보호된 함수 addUser($name){
에코($이름);
}
}
//테스트 유사 사용자
클래스 테스트는 IRunAction을 구현합니다.{
static private $__actions = array('addTest', 'modifyTest', 'removeTest');
정적 공개 함수 LoadActions(){
return self::$__actions;
}
공개 함수 runAction($action, $args){
call_user_func(array($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 메소드가 무엇인지는 코드를 보면 알 수 있습니다. 일부 책의 getInstance 정적 메소드에는 addCommand, runCommand 및 RemoveCommand라는 세 가지 공용 메소드가 있는 것과 동일한 APP 클래스 인스턴스를 로드합니다. 이는 또한 명령 체인 모드의 핵심 시작 프로그램입니다. 구체적인 구현에 대한 소스 코드를 참조하세요. 코드는 매우 명확하게 작성되어 있습니다. 여기서는 자세히 설명하지 않겠습니다.
User 및 Test 클래스는 IRunAction 인터페이스를 구현합니다. 두 클래스 모두 APP의 runCommand 함수에서 호출할 수 있는 작업이 포함된 배열인 정적 개인 변수 $__actions를 정의합니다.
다음은 시스템의 실행 프로세스입니다
.
-------addCommand, 실행할 Operation이 속한 클래스를 APP에 추가합니다. 추가된 클래스를 싱글톤 모드로 설계한 경우 다음과 같이 addCommand(SingletonClass::Load())를 추가할 수 있습니다. 그렇지 않으면 다음과 같이 추가할 수 있습니다. Call
addCommand(new someClass)
-------runCommand.예를 들어 User 클래스에 addUser 작업이 있으면 APP의 $__commands 배열을 통해 루프를 직접 활성화할 수 있습니다. 클래스 중 하나의 인스턴스입니다. 이 작업이 있는 경우 해당 인스턴스의 runAction 함수를 호출합니다. addCommand를 사용하여 특정 클래스의 인스턴스를 추가하지 않으면 정의되지 않은 작업을 수행하라는 메시지가 표시되고 종료됩니다.
User 클래스와 Test 클래스의 runAction은 매우 일반적으로 사용되는 함수인 call_user_func를 호출합니다.
팁: 이것이 설명과 예제의 끝입니다. (ps: 프레임워크에서 단일 항목 파일로 만들 수 있습니다. MVC를 구현할지 여부는 여러분의 생각에 달려 있습니다.)