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

定義

將一個(gè)請(qǐng)求封裝成一個(gè)對(duì)象,從而使您可以用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化。


角色

1、received 真正的命令執(zhí)行對(duì)象
2、Command
3、invoker 使用命令對(duì)象的入口


優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

1、降低了系統(tǒng)耦合度。
2、新的命令可以很容易添加到系統(tǒng)中去。

缺點(diǎn)

使用命令模式可能會(huì)導(dǎo)致某些系統(tǒng)有過多的具體命令類。


場(chǎng)景模擬

遙控器遙控電視


命令模式UML圖

UML圖

簡(jiǎn)單代碼

#import <Foundation/Foundation.h>

@protocol Command <NSObject>
-(void)execute;
@end

#import <Foundation/Foundation.h>
#import "Command.h"
@interface OpenTV : NSObject<Command>
@end
#import "OpenTV.h"
@implementation OpenTV
-(void)execute{
    NSLog(@"打開電視");
}
@end
#import <Foundation/Foundation.h>
#import "Command.h"

@interface CloseTV : NSObject<Command>

@end
#import "CloseTV.h"
@implementation CloseTV
-(void)execute{
    NSLog(@"關(guān)閉電視");
}
@end

#import <Foundation/Foundation.h>
#import "Command.h"
@interface Remote : NSObject

-(void)setCommand:(id<Command>)command;
-(void)invokeCommand;
@end

#import "Remote.h"
@interface Remote()
@property (nonatomic,strong) id<Command> command;
@end
@implementation Remote

-(void)setCommand:(id<Command>)command
{
    _command = command;
}

-(void)invokeCommand{
    [self.command execute];
}
@end

測(cè)試代碼

  Remote * remote = [Remote new];
    OpenTV *openTV = [OpenTV new];
    CloseTV * closeTV = [CloseTV new];
    [remote setCommand:openTV];
    [remote invokeCommand];
    [remote setCommand:closeTV];
    [remote invokeCommand];

測(cè)試結(jié)果

2018-04-10 13:53:40.898689+0800 行為型設(shè)計(jì)模式-命令模式[53130:8160569] 打開電視
2018-04-10 13:53:40.898824+0800 行為型設(shè)計(jì)模式-命令模式[53130:8160569] 關(guān)閉電視

看別人寫的命令模式樣板都是在command 中引入一個(gè)可以執(zhí)行命令的對(duì)象 。我這里只是單純的打印下,要是修改成別人的樣子應(yīng)該,在OpenTV 和CloseTV 中引入一個(gè)TV 類,這個(gè)TV 類應(yīng)該包含closeTV 和openTV等實(shí)現(xiàn)。每次執(zhí)行execute方法的時(shí)候,交給這個(gè)TV 對(duì)象去執(zhí)行。

UML 圖如下

完全體命令模式

其實(shí)TV類可以設(shè)計(jì)成接口,就可以隨便更換電視機(jī)了。


命令模式
非命令模式

這兩個(gè)圖對(duì)比,我們知道,命令模式相當(dāng)于中間加了一層。假如我們有一個(gè)新命令,撤銷功能,那么我們只需要新增一個(gè)command類,TV 實(shí)現(xiàn)不實(shí)現(xiàn)撤銷功能,reomote調(diào)用都不會(huì)導(dǎo)致程序出問題,非命令模式就不行了,要是不實(shí)現(xiàn)命令模式那么調(diào)用肯定要報(bào)錯(cuò)。

這符合設(shè)計(jì)模式的六大原則之開閉原則。


借鑒博客
源代碼地址

下一篇博客
行為型設(shè)計(jì)模式-解釋器模式

最后編輯于
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、概念 本質(zhì)是一種數(shù)據(jù)驅(qū)動(dòng)、事件驅(qū)動(dòng)的設(shè)計(jì)模式。 1.1、定義 又稱為動(dòng)作(Action)模式或事務(wù)(Trans...
    雙魚子曰1987閱讀 294評(píng)論 0 0
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,701評(píng)論 0 5
  • 【學(xué)習(xí)難度:★★★☆☆,使用頻率:★★★★☆】直接出處:命令模式梳理和學(xué)習(xí):https://github.com/...
    BruceOuyang閱讀 926評(píng)論 0 3
  • 摘要:政和白茶白牡丹由于作為2016年G20峰會(huì)迎賓茶而知名度大升,但是,歷史上的政和白茶名氣可是遠(yuǎn)遠(yuǎn)大于今天,甚...
    白茶筆記閱讀 1,161評(píng)論 0 0
  • 我們是活著的,動(dòng)態(tài)的,我們的身體當(dāng)然一定會(huì)對(duì)各種刺激、傷害作出反應(yīng),這些反應(yīng)不在正常范圍,于是就變成了疾病,實(shí)際上...
    清遠(yuǎn)_a429閱讀 293評(píng)論 0 0

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