濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > PHP命令Command模式用法實(shí)例分析

PHP命令Command模式用法實(shí)例分析

熱門標(biāo)簽:代理打電話機(jī)器人 宿州正規(guī)外呼系統(tǒng)軟件 電信外呼系統(tǒng)多少錢一個(gè)月 萍鄉(xiāng)商鋪地圖標(biāo)注 企業(yè)400電話辦理多少費(fèi)用 神龍斗士電話機(jī)器人 桂陽(yáng)公司如何做地圖標(biāo)注 合肥企業(yè)外呼系統(tǒng)線路 太原400電話申請(qǐng)流程

本文實(shí)例講述了PHP命令Command模式用法。分享給大家供大家參考,具體如下:

命令Command模式是GOF23種模式中的一種,是一種行為模式。這種模式很難理解?!对O(shè)計(jì)模式》一書(shū)中對(duì)它語(yǔ)焉不詳。而網(wǎng)上的一些文章對(duì)其的解釋也是錯(cuò)誤的。實(shí)際上,命令模式并不是那么神秘。

命令模式的理解,關(guān)鍵有2點(diǎn):

1. 使用接口。通常命令模式的接口中只有一個(gè)方法。 實(shí)現(xiàn)類的方法有不同的功能,覆蓋接口中的方法。在面向?qū)ο缶幊讨?,大量使?code>if…else…,或者switch…case…這樣的條件選擇語(yǔ)句是“最差實(shí)踐”。通常這類代碼,意味著有重構(gòu)的余地。命令模式就是干掉條件選擇語(yǔ)句的利器。

首先提供一個(gè)接口:

public interface Command {
  public void execute();
}

然后提供這個(gè)接口的實(shí)現(xiàn)類。每一個(gè)實(shí)現(xiàn)類的方法就是if…else…的一個(gè)代碼塊中的代碼。這樣,調(diào)用方直接把一個(gè)具體類的實(shí)例傳進(jìn)來(lái)即可。如:

Public void test(Command para){
  Para.execute();
}

不需要再判斷出現(xiàn)了哪種情況,應(yīng)該執(zhí)行哪一段代碼。一切的問(wèn)題都由調(diào)用方處理。

如果不使用命令模式,那么如果情況逐步增多,如,從原來(lái)的2種,增加到20種,那么方法中的判斷就會(huì)從1次增加到19次。而使用命令模式,僅僅調(diào)用方需要從2個(gè)實(shí)現(xiàn)類增加到20個(gè)實(shí)現(xiàn)類即可。上面的test方法根本不需要做任何改變。

2. 主要的用途是,使用參數(shù)回調(diào)模式。

最主要使用命令模式的方式是使用參數(shù)回調(diào)模式。命令接口作為方法的參數(shù)傳遞進(jìn)來(lái)。然后,在方法體內(nèi)回調(diào)該接口。

當(dāng)然,命令模式還可以使用其他方式來(lái)使用。不一定非用參數(shù)回調(diào)模式。

了解完這些之后,可以看一下下面的程序例子。

?php
  /**
   * 命令模式
   *
   * 將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象從而使你可用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化,對(duì)請(qǐng)求排除或記錄請(qǐng)求日志,以及支持可取消的操作
   */
  // 命令接口
  interface Command
  {
    public function execute();
  }
  class Invoker
  {
    private $_command = array();
    public function setCommand($command) {
      $this->_command[] = $command;
    }
    public function executeCommand()
    {
      foreach($this->_command as $command)
      {
        $command->execute();
      }
    }
    public function removeCommand($command)
    {
      $key = array_search($command, $this->_command);
      if($key !== false)
      {
        unset($this->_command[$key]);
      }
    }
  }
  // 命令接受者
  class Receiver
  {
    private $_name = null;
    public function __construct($name) {
      $this->_name = $name;
    }
    public function action()
    {
       echo $this->_name." 執(zhí)行攻擊命令(action)br />";
    }
    public function action1()
    {
      echo $this->_name." 執(zhí)行防御命令(action1)br/>";
    }
  }
  // 具體的命令
  class ConcreteCommand implements Command
  {
    private $_receiver;
    public function __construct($receiver)
    {
      $this->_receiver = $receiver;
    }
    public function execute()
    {
      $this->_receiver->action();
    }
  }
  // 具體命令1
  class ConcreteCommand1 implements Command
  {
    private $_receiver;
    public function __construct($receiver)
    {
      $this->_receiver = $receiver;
    }
    public function execute()
    {
      $this->_receiver->action1();
    }
  }
  // 具體命令2
  class ConcreteCommand2 implements Command
  {
    private $_receiver;
    public function __construct($receiver)
    {
      $this->_receiver = $receiver;
    }
    public function execute()
    {
      $this->_receiver->action();
      $this->_receiver->action1();
    }
  }
  $objRecevier = new Receiver("小狗");
  $objRecevier1 = new Receiver("刺蛇");
  $objRecevier2 = new Receiver("雷獸");
  $objCommand = new ConcreteCommand($objRecevier);
  $objCommand1 = new ConcreteCommand1($objRecevier);
  $objCommand2 = new ConcreteCommand($objRecevier1);
  $objCommand3 = new ConcreteCommand1($objRecevier1);
  $objCommand4 = new ConcreteCommand2($objRecevier2); // 使用 Recevier的兩個(gè)方法
  $objInvoker = new Invoker();
  $objInvoker->setCommand($objCommand);
  $objInvoker->setCommand($objCommand1);
  $objInvoker->executeCommand();
  $objInvoker->removeCommand($objCommand1);
  $objInvoker->executeCommand();
  $objInvoker->setCommand($objCommand2);
  $objInvoker->setCommand($objCommand3);
  $objInvoker->setCommand($objCommand4);
  $objInvoker->executeCommand();
?>

程序運(yùn)行結(jié)果:

小狗 執(zhí)行攻擊命令(action)
小狗 執(zhí)行防御命令(action1)
小狗 執(zhí)行攻擊命令(action)
小狗 執(zhí)行攻擊命令(action)
刺蛇 執(zhí)行攻擊命令(action)
刺蛇 執(zhí)行防御命令(action1)
雷獸 執(zhí)行攻擊命令(action)
雷獸 執(zhí)行防御命令(action1)

命令模式的核心思想是,帶有某個(gè)方法的具體類的實(shí)例,作為接口傳給使用方。對(duì)象的具體類型信息消失。在使用方代碼中拿到這個(gè)接口后調(diào)用這個(gè)接口的方法。

具體的執(zhí)行效果,取決的命令發(fā)起人提供的對(duì)象是哪一個(gè)實(shí)現(xiàn)類的。這給了命令發(fā)起人完全的控制能力,而使用方代碼不關(guān)心具體的命令類和方法。同時(shí)也使條件判斷語(yǔ)句成為多余。

簡(jiǎn)單嗎?命令模式其實(shí)就是這么簡(jiǎn)單。

其實(shí),GOF的23個(gè)設(shè)計(jì)模式中,好幾個(gè)模式使用了相同的技巧來(lái)實(shí)現(xiàn)。GOF對(duì)模式的劃分,是根據(jù)目的來(lái)的,而不是技巧來(lái)的。因此,Command模式和策略模式等其實(shí)使用的技法是一樣的。 上回和一個(gè)同事聊技術(shù)。他的背景是Windows C++和Windows驅(qū)動(dòng)開(kāi)發(fā)。 他說(shuō),他不知道什么設(shè)計(jì)模式。他覺(jué)得最有用的就是回調(diào)函數(shù)。Command模式也是使用回調(diào)函數(shù)。java沒(méi)有函數(shù)指針,java中一切都是類和類的實(shí)例。因此,就需要使用一個(gè)只有一個(gè)函數(shù)的接口,它的實(shí)例表示函數(shù)指針。其實(shí)是一回事。

設(shè)計(jì)模式是比較低層次的設(shè)計(jì)思想。在更高層次上,還有更加宏觀的一些設(shè)計(jì)技巧。 Bob大叔的一本書(shū)不錯(cuò),忘記名字了。 《Unix編程藝術(shù)》也不錯(cuò),都是講更高層次上的設(shè)計(jì)的。

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語(yǔ)法入門教程》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總》

希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。

您可能感興趣的文章:
  • php設(shè)計(jì)模式 Command(命令模式)
  • php設(shè)計(jì)模式 Command(命令模式)
  • 學(xué)習(xí)php設(shè)計(jì)模式 php實(shí)現(xiàn)命令模式(command)
  • Laravel如何自定義command命令淺析

標(biāo)簽:崇左 綏化 太原 鄂州 辛集 白銀 廊坊 衡陽(yáng)

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PHP命令Command模式用法實(shí)例分析》,本文關(guān)鍵詞  PHP,命令,Command,模式,用法,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《PHP命令Command模式用法實(shí)例分析》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于PHP命令Command模式用法實(shí)例分析的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    丹东市| 大港区| 施甸县| 双鸭山市| 上饶市| 红安县| 翁源县| 泸西县| 蒲江县| 枣阳市| 乌拉特中旗| 望奎县| 隆林| 分宜县| 永登县| 台江县| 阿尔山市| 盐池县| 南京市| 潼南县| 买车| 连云港市| 遂昌县| 定安县| 中江县| 贵南县| 鹤庆县| 汉源县| 罗田县| 蛟河市| 新营市| 德格县| 南召县| 富裕县| 东乌| 宁南县| 汾西县| 建水县| 绿春县| 西城区| 香港 |