PHP
·
发表于 5年以前
·
阅读量:8308
Õa¸oģʽÖ÷ÒªÓÉ ÃuÁiÀa¡¢Óû§ÇeÇoÊý¾ÝÀa¡¢ÒµÎñÂß¼Àa¡¢ÃuÁiÀa¹¤³§Àa¼°µ÷ÓÃÀa¹¹³É£¬¸÷¸oÀaµÄ×÷ÓøÅÀ¨ÈçÏ£º
1¡¢ÃuÁiÀa£ºµ÷ÓÃÓû§ÇeÇoÊý¾ÝÀaºÍÒµÎñÂß¼Àa£»
2¡¢Óû§ÇeÇoÊý¾ÝÀa£º»ñÈ¡Óû§ÇeÇoÊý¾Ý¼°±£´aeºǫ´¦Àiºo*µ»ØµÄ½a¹u£»
3¡¢ÒµÎñÂß¼Àa£ºÈçÒÔϵÄʾÀýÖÐÑeÖ¤Óû§µÇ½ÐÅÏ¢ÊÇñÕýȵŦÄܵȣ»
4¡¢ÃuÁi¹¤³§Àa(ÎÒ×Ô¼ºÈ¡µÄÃu×Ö,¹þ¹þ)£ºÉu³ÉÃuÁiÀaµÄʵÀý£¬Õa¸oÀaµÚÒ»´Î¿´µÄʱºoÎÒ¾oµÃÓеaŒÅ£¬µ±È»¿´Á˼¸±eÁË»¹ÊǾoµÃºÜŒÅ £º£(C)£»
5¡¢µ÷ÓÃÀa£ºµ÷ÓÃÃuÁiÀa£¬Éu³ÉÊÓͼ£»
Ö±½Ó¿´´uÂe£º
//ÃuÁiÀa
abstract class Command {
¡¡¡¡abstract function execute(CommandContext $context);
}
class LoginCommand extends Command{¡¡¡¡¡¡¡¡¡¡¡¡¡¡//´¦ÀiÓû§µÇ½ÐÅÏ¢µÄÃuÁiÀa
¡¡¡¡function execute (CommandCotext $context){¡¡¡¡¡¡¡¡//CommandCotext ÊÇÒ»¸o´¦ÀiÓû§ÇeÇoÊý¾ÝºÍºǫ»ØÀ¡Êý¾ÝµÄÀa
¡¡¡¡¡¡¡¡$manager = Registry::getAccessManager();¡¡¡¡//ÔÎÄ´uÂeÖв¢Ã»ÓоßÌaµÄʵÏÖ£¬µ«ËµÃ÷ÁËÕaÊÇÒ»¸o´¦ÀiÓû§µÇ½ÐÅÏ¢µÄÒµÎñÂß¼Àa
¡¡¡¡¡¡¡¡$user = $context->get('username');
¡¡¡¡¡¡¡¡$pass = $context->get('pass');
¡¡¡¡¡¡¡¡$user_obj = $manager->login($user,$pass);
¡¡¡¡¡¡¡¡if(is_null($user_obj)){
¡¡¡¡¡¡¡¡¡¡¡¡$context->setError($manager->getError);
¡¡¡¡¡¡¡¡¡¡¡¡return false;
¡¡¡¡¡¡¡¡}
¡¡¡¡¡¡¡¡$context->addParam('user',$user_obj);
¡¡¡¡¡¡¡¡return true;¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡//Óû§µÇ½³É¹¦*µ»Øtrue
¡¡¡¡}
}
class FeedbackCommand extends Command{¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡//*¢ËÍÓʼþµÄÃuÁiÀa
¡¡¡¡function execute(CommandContext $context){
¡¡¡¡¡¡¡¡$msgSystem = Registry::getMessageSystem();
¡¡¡¡¡¡¡¡$email = $context->get('email');
¡¡¡¡¡¡¡¡$msg = $context->get('msg');
¡¡¡¡¡¡¡¡$topic = $context->get('topci');
¡¡¡¡¡¡¡¡$result = $msgSystem->send($email,$msg,$topic);
¡¡¡¡¡¡¡¡if(!$result){
¡¡¡¡¡¡¡¡¡¡¡¡$context->setError($msgSystem->getError());
¡¡¡¡¡¡¡¡¡¡¡¡return false;
¡¡¡¡¡¡¡¡}
¡¡¡¡¡¡¡¡return true;
¡¡¡¡}
}
//Óû§ÇeÇoÊý¾ÝÀa
class CommandContext {
¡¡¡¡private $params = array();
¡¡¡¡private $error = '';
¡¡¡¡function __construct (){
¡¡¡¡$this->params = $_REQUEST;
}
function addParam($key,$val){
¡¡¡¡$this->params[$key] = $val;
}
function get($key){
¡¡¡¡return $this->params[$key];
}
function setError($error){
¡¡¡¡$this->error = $error;
}
function getError(){
¡¡¡¡return $this->error;
}
}
//ÃuÁiÀa¹¤³§,Õa¸oÀa¸u¾ÝÓû§ÇeÇoÊý¾ÝÖеÄactionÀ´Éu³ÉÃuÁiÀa
class CommandNotFoundException extends Exception {}
class CommandFactory {
¡¡¡¡private static $dir = 'commands';
¡¡¡¡static function getCommand($action='Default'){
¡¡¡¡¡¡¡¡if(preg_match('/\w',$action)){
¡¡¡¡¡¡¡¡¡¡¡¡throw new Exception("illegal characters in action");
¡¡¡¡¡¡¡¡}
¡¡¡¡¡¡¡¡$class = UCFirst(strtolower($action))."Command";
¡¡¡¡¡¡¡¡$file = self::$dir.DIRECTORY_SEPARATOR."{$class}.php"; //DIRECTORY_SEPARATOR´u±i'/',ÕaÊÇÒ»¸oÃuÁiÀaÎļþµÄÂ*¾¶
¡¡¡¡¡¡¡¡if(!file_exists($file)){
¡¡¡¡¡¡¡¡¡¡¡¡throw new CommandNotFoundException("could not find '$file'");
¡¡¡¡¡¡¡¡}
¡¡¡¡¡¡¡¡require_once($file);
¡¡¡¡¡¡¡¡if(!class_exists($class)){
¡¡¡¡¡¡¡¡¡¡¡¡throw new CommandNotFoundException("no '$class' class located");
¡¡¡¡¡¡¡¡}
¡¡¡¡¡¡¡¡$cmd = new $class();
¡¡¡¡¡¡¡¡return $cmd;
¡¡¡¡}
}
//µ÷ÓÃÕßÀa,Ïaµ±ÓÚÒ»¸o˾Ái²¿Ëuͳ³iËuÓеÄ×ÊÔ´
class Controller{
¡¡¡¡private $context;
¡¡¡¡function __construct(){
¡¡¡¡¡¡¡¡$this->context = new CommandContext(); //Óû§ÇeÇoÊý¾Ý
¡¡¡¡}
¡¡¡¡function getContext(){
¡¡¡¡¡¡¡¡return $this->context;
¡¡¡¡}
¡¡¡¡function process(){
¡¡¡¡¡¡¡¡$cmd = CommandFactory::getCommand($this->context->get('action'));¡¡¡¡¡¡¡¡//ͨ¹ýÃuÁi¹¤³§ÀaÀ´»ñÈ¡ÃuÁiÀa
¡¡¡¡¡¡¡¡if(!$comd->execute($this->context)){¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡//´¦Àiʧ°Ü
¡¡¡¡¡¡¡¡} else {
¡¡¡¡¡¡¡¡¡¡¡¡//³É¹¦
¡¡¡¡¡¡¡¡¡¡¡¡// *Ö*¢ÊÓͼ
¡¡¡¡¡¡¡¡}
¡¡¡¡}
}
// ¿Í»§¶Ë
$controller = new Controller();
//αÔiÓû§ÇeÇo,ÕaeʵµÄ³¡¾°ÖÐÕaÐ(C)²ÎÊýÓ¦¸ÃÊÇͨ¹ýpost»ogetµÄ*½Ê½»ñÈ¡µÄ£¬Ã²ËÆÓÖ*Ï»°ÁË£º£(C)
$context = $controller->getContext();
$context->addParam('action','login');
$context->addParam('username','bob');
$context->addParam('pass','tiddles');
$controller->process();
ÒÔÉÏÕaƪÀÏÉu³£Ì¸PHPÃaeÏo¶ÔÏoÖ®ÃuÁiģʽ(±Ø¿´Æª)¾ÍÊÇС±a*ÖÏi¸ø´o¼ÒµÄÈ«²¿ÄÚÈÝÁË£¬Ï£ÍuÄܸø´o¼ÒÒ»¸o²Î¿¼£¬Ò²Ï£Íu´o¼Ò¶a¶aÖ§³Ö½Å±¾Ö®¼Ò¡£