命令模式三:動(dòng)態(tài)命令

動(dòng)態(tài)命令:我們不需要新建各種命令類 (block實(shí)現(xiàn))

DynamicComment.h

#import "TMCommandProtocol.h"
#import "TerisMachine.h"
/動(dòng)態(tài)命令
typedef void(^DynamicBlock)(TerisMachine *);
//1.實(shí)現(xiàn)命令協(xié)議
//2.傳遞接收者
@interface DynamicComment : NSObject<TMCommandProtocol>
- (instancetype)init:(TerisMachine *)tm block:(DynamicBlock)tmBlock;
+ (id<TMCommandProtocol>)createCommand:(TerisMachine *)tm block:(DynamicBlock)tmBlock;
@end

DynamicComment.h

#import "DynamicComment.h"
@interface DynamicComment()
@property (nonatomic, strong) TerisMachine *machine;
@property (nonatomic, copy) DynamicBlock tmBlock;

@end
@implementation DynamicComment

- (instancetype)init:(TerisMachine *)tm block:(DynamicBlock)tmBlock
{
    self = [super init];
    if (self) {
        self.machine = tm;
        self.tmBlock = tmBlock;
    }
    return self;
}
//關(guān)于命令方式的小框架
//創(chuàng)建對象初始化的參數(shù)過于復(fù)雜我們可以內(nèi)部提供
+ (id<TMCommandProtocol>)createCommand:(TerisMachine *)tm block:(DynamicBlock)tmBlock {
    return [[DynamicComment alloc]init:tm block:tmBlock];
}

- (void)execute {
    self.tmBlock(self.machine);
}

@end

DynamicCommentManager.h

#import <Foundation/Foundation.h>
#import "TerisMachine.h"
NS_ASSUME_NONNULL_BEGIN
//動(dòng)態(tài)命令管理器
@interface DynamicCommentManager : NSObject
- (instancetype)init:(TerisMachine *)tm ;
- (void)toLeft;
- (void)toRight;
- (void)toTransform;
- (void)undo;
- (void)undoAll;
@end

DynamicCommentManager.m

#import "DynamicCommentManager.h"
#import "DynamicComment.h"
#import "objc/message.h"

@interface DynamicCommentManager()
@property (nonatomic, strong) TerisMachine *machine;
@property (nonatomic, strong) NSMutableArray*commands;
@end

@implementation DynamicCommentManager

- (instancetype)init:(TerisMachine *)tm {
    self = [super init];
    if (self) {
        _machine = tm;
        self.commands = [NSMutableArray array];
    }
    return self;
}

- (void)toLeft {
    [self addCommand:NSStringFromSelector(_cmd)];
    if (class_respondsToSelector([self.machine class], _cmd)) {
        objc_msgSend(self.machine, _cmd);
    }//判斷類中是否包含某個(gè)方法的實(shí)現(xiàn)
  
}
- (void)toRight {
    [self addCommand:NSStringFromSelector(_cmd)];
    objc_msgSend(self.machine, _cmd);
}
- (void)toTransform {
    [self addCommand:NSStringFromSelector(_cmd)];
    objc_msgSend(self.machine, _cmd);
}

- (void)undo {
    if (self.commands.count > 0) {
        NSLog(@"撤銷");
        //撤銷
        [[self.commands lastObject]execute];
        //移除
        [self.commands removeLastObject];
    }
}

- (void)undoAll {
    NSLog(@"撤銷所有");
    //應(yīng)該倒敘刪除
    for (id <TMCommandProtocol>command in self.commands) {
        [command execute];
    }
    [self.commands removeAllObjects];
}
//根據(jù)方法名稱,動(dòng)態(tài)加載執(zhí)行對象的方法
- (void)addCommand:(NSString *)methodName {
    //獲取到方法對象
    SEL method = NSSelectorFromString(methodName);
    //添加動(dòng)態(tài)命令
    __weak DynamicCommentManager *weakSelf = self;
    [self.commands addObject:[DynamicComment createCommand:self.machine block:^(TerisMachine *tm){
        objc_msgSend(weakSelf.machine, method);
    }]];
    
}

@end

main

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World!");
        TerisMachine *tm = [TerisMachine new];
        DynamicCommentManager *manager = [[DynamicCommentManager alloc]init:tm];
        [manager toLeft];
        [manager toRight];
        [manager toTransform];
//        [manager undo];
    }
    return 0;
}

來自潭州課堂

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

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,689評論 1 32
  • 01 最近在看到《奇葩說》第三季有一期談到是否該鼓勵(lì)絕癥病人活下去,現(xiàn)場的許多人淚如雨下。 的確,生死面前,都是小...
    胡圣榮閱讀 649評論 3 2
  • 時(shí)光飛逝,轉(zhuǎn)眼間孩子們已經(jīng)入營四天。通過四天緊張充實(shí)的軍營生活,小營員們已經(jīng)蛻變成一名合格的特種兵小戰(zhàn)士。他們在成...
    君臨天下紫龍閱讀 558評論 1 1
  • 2018.5.12 韓文萍 驚聞空姐遇劫難, 肩背拔涼心冒汗。 江歌冤魂猶悲戚, 花季空姐又喊冤。 當(dāng)今社會(huì)怎么啦...
    含文在線閱讀 319評論 0 0
  • 你要怎么過余生?我們在人生的路上,就會(huì)不停的被這個(gè)問題追問到。 也許我們還過很多的歷史和人物傳記,但是人家的人生,...
    國棟愛讀書閱讀 279評論 0 0

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