多数大学生出来选择的工作和专业无关
首页 > 专业知识

PHP单件模式和命令链模式的基础知识

时间:2018-01-13 15:17:36 [来源]:郑州PHP培训学校

   PHP单件模式和命令链模式的基础知识

  初学者对于设计模式肯定存在着很多不明白之处,今天刚好周末,就抽出来点时间写了一个单件模式结 合命令链模式打造系统核心的文章,可能对于部分人来说,文章内容过于浅显,这是送给初学者的教程,因为 时间比较紧(要陪老婆逛街,呵呵),其中出现了设计不规范的,代码书写不规范的,bug等等还望各路大侠指 出来,方便大家共同进步.本人水平有限.^_^相信大家都已经读过很多关于在PHP中应用设计模式的书籍或是文章,但是很少有直接给予实例,大部分 看完之后有种迷迷糊糊的感觉,如果没有项目实践,很难将设计模式部分弄清楚.
  为避免代码过于复杂.没有添加异常处理等内容.
  单件模式以及命令链模式的基础知识,大家自己google一下.不详细讲了.下面直接看实例:
  /*
  *@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;
  }
 

上一篇:浅谈PHP开发团队的管理之道

下一篇:PHP字符串操作简单入门