定義
將一個(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圖

簡(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ì)模式-解釋器模式