設(shè)計(jì)模式--命令模式

架構(gòu)學(xué)習(xí)經(jīng)驗(yàn)(學(xué)習(xí)分析框架的思想)

第一步:基本概念(了解)
第二步:確定框架模式
第三步:分析角色(每一種設(shè)計(jì)模式里面都會(huì)有角色劃分),不同場(chǎng)景下角色不同,一個(gè)類(lèi)擔(dān)當(dāng)角色達(dá)到3個(gè)之多
例如:一個(gè)User類(lèi)(具體產(chǎn)品類(lèi)、抽象產(chǎn)品類(lèi)),在架構(gòu)設(shè)計(jì)存在多種角色劃分
第四步:分析單個(gè)角色類(lèi)架構(gòu)(開(kāi)源項(xiàng)目)
第五步:分析單個(gè)角色意義,及其子類(lèi)所在意義
第六步:分析模塊
第七步:性能優(yōu)化問(wèn)題

一、命令模式

命令模式——> 定義

將一個(gè)請(qǐng)求封裝成為一個(gè)對(duì)象,從而讓用戶(hù)使用不同的請(qǐng)求將客戶(hù)端參數(shù)化
讓我們程序擴(kuò)展性更加好,耦合降低

命令模式——>應(yīng)用場(chǎng)景

當(dāng)需要將方法調(diào)用包裝成一個(gè)對(duì)象,以延時(shí)方法調(diào)用,或者讓其他組件在對(duì)其內(nèi)部實(shí)現(xiàn)細(xì)節(jié)不了解的情況下進(jìn)行調(diào)用的時(shí)候可以使用命令模式

場(chǎng)景一:應(yīng)用程序支持撤銷(xiāo)和恢復(fù)
場(chǎng)景二:記錄請(qǐng)求日志,當(dāng)系統(tǒng)故障這些命令可以重新被執(zhí)行
場(chǎng)景三:想用對(duì)象參數(shù)化一個(gè)動(dòng)作以執(zhí)行操作,并且用不同命令對(duì)象來(lái)替換回調(diào)函數(shù)

命令模式—>特點(diǎn)

命令模式保存操作,具體撤銷(xiāo)的邏輯由客戶(hù)端決定

二、分析命令模式角色劃分

1.命令模式共分為4個(gè)角色 ->(對(duì)于陌生的框架,分析每一個(gè)類(lèi)什么角色)

角色一:接收者
角色二:命令接口
角色三:具體命令
角色四:請(qǐng)求者

2.命令模式->案例分析

  命令模式的規(guī)范
  1.角色一:接收者->Receiver
  2.角色二:命令接口-> CommandProtocal(協(xié)議) 
  3.角色三:具體命令->ConcrateCommand
  4.角色四:請(qǐng)求者->invoker

3.命令模式->具體案例(面向協(xié)議編程->將所有的功能都抽成為協(xié)議)

每一個(gè)角色之間關(guān)系和調(diào)用

案例:電腦關(guān)機(jī)和開(kāi)機(jī)
   確定角色
  1.命令接口->ComputerCommandProtocal
  2.具體命令->實(shí)現(xiàn)類(lèi)
     兩個(gè)命令:開(kāi)機(jī)、關(guān)機(jī)
     開(kāi)機(jī):MacStartupCommand(遵循協(xié)議 == 接口)
     關(guān)機(jī):MacShutdownCommand(遵循協(xié)議 == 接口)
 3.接收者->電腦->MacComputer
 4.請(qǐng)求者->MacInvoker
  關(guān)聯(lián)角色?
       首先:關(guān)聯(lián)請(qǐng)求者   
       其次: 實(shí)現(xiàn)接收者
       最后:實(shí)現(xiàn)命令角色

4.命令模式->深入案例->加強(qiáng)理解

案例:俄羅斯方塊
       左命令、
       右命令、
       變形命令
   理解原理
     分析角色
     角色一:命令接口(抽象命令)->TMCommandProtocal
     角色二:具體命令(持有接收者)
         1.左命令->TMLeftCommand
         2.右命令->TMRightCommand
         3.變形命令: ->TMTransformCommand
     角色三:接收者(具體方法的實(shí)現(xiàn))->TetrisMachine
     角色四:請(qǐng)求者(持有具體命令)->TetrisMachineManager(管理回調(diào)命令)
  增加的需求:
       >記錄所有操作
       >回退,執(zhí)行命令

三、命令模式—>泛型設(shè)計(jì)

案例一:原始案例->電腦開(kāi)關(guān)機(jī)

案例二:命令模式->案例設(shè)計(jì)

案例三:命令模式->案例進(jìn)階->撤銷(xiāo)功能

案例四:命令模式->案例進(jìn)階->動(dòng)態(tài)調(diào)用->代碼優(yōu)化第一步

  • 第一步:分析問(wèn)題
    問(wèn)題:很多的命令類(lèi)(開(kāi)發(fā)中巨大問(wèn)題)
  • 第二步:解決方案
    動(dòng)態(tài)命令:好處在于不需要新建各種命令類(lèi)(block實(shí)現(xiàn))
  • 第三步:實(shí)現(xiàn)功能—>命令模式變種
    回調(diào)方式:協(xié)議、block、通知等
    動(dòng)態(tài)命令管理器->DynamicCommandManager
  • 第四步:分析調(diào)用流程

    調(diào)用的流程
    1.添加命令->調(diào)用了addCommands方法
    2.創(chuàng)建命令-> creatCommand方法(通過(guò)runtime實(shí)現(xiàn)的)
    *注意:創(chuàng)建一個(gè)block,將block作為了參數(shù)傳遞
    3.保存block->賦值給屬性
    4.調(diào)用撤銷(xiāo)->undo方法
    5.執(zhí)行命令->執(zhí)行DynamicCommand對(duì)象中的executel方法
    6.回調(diào)block
    7.執(zhí)行tm方法->也就是最后一個(gè)命令

案例五:命令模式->案例進(jìn)階->復(fù)合命令->代碼優(yōu)化第二步

命令模式變種->復(fù)合命令:執(zhí)行多個(gè)命令
第一步:新建一個(gè)復(fù)合命令->WrapperCommand
特點(diǎn):實(shí)現(xiàn)協(xié)議->TMCommandPtotocal
第二步:新建復(fù)合命令管理器->WrapperCommandManager
第三步:總結(jié)
以后看到了這樣的代碼結(jié)構(gòu),框架架構(gòu),這個(gè)就是復(fù)合命令(變種)

案例六:命令模式->案例進(jìn)階->泛型命令->代碼優(yōu)化第三步- >系統(tǒng)NSUndoManager實(shí)現(xiàn)

第一步:什么是泛型

  • 在定義的時(shí)候不需要指定了類(lèi)型,在使用的時(shí)候指定類(lèi)型
  • 聲明文件用T,實(shí)現(xiàn)文件使用id

第二步:泛型基礎(chǔ)知識(shí)普及

第三步:學(xué)習(xí)泛型

  • 新建一個(gè)泛型類(lèi)->泛型命令->GenericsCommand
    注意:id是指向泛型類(lèi)型(T)的引用
  • 新建一個(gè)命令管理類(lèi)->泛型命令-> GenericsCommandManager

案例七:命令模式->案例進(jìn)階->并發(fā)處理

  • 分析問(wèn)題
    多線程當(dāng)中存在同時(shí)緩存命令
  • 解決方案
    多線程->隊(duì)列
  • 功能實(shí)現(xiàn)
    第一步: 定義一個(gè)并發(fā)管理器-> 創(chuàng)建一個(gè)隊(duì)列->QueueCommandManager

案例八:命令模式->案例進(jìn)階->Block命令(優(yōu)化)

上面使用的是:協(xié)議,最后這個(gè)使用:Block實(shí)現(xiàn)(添加動(dòng)態(tài)命令時(shí),保存的是block對(duì)象)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容