命令模式三:动态命令

动态命令:我们不需要新建各种命令类 (block实现)

DynamicComment.h

#import "TMCommandProtocol.h"
#import "TerisMachine.h"
/动态命令
typedef void(^DynamicBlock)(TerisMachine *);
//1.实现命令协议
//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;
}
//关于命令方式的小框架
//创建对象初始化的参数过于复杂我们可以内部提供
+ (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
//动态命令管理器
@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);
    }//判断类中是否包含某个方法的实现
  
}
- (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(@"撤销所有");
    //应该倒叙删除
    for (id <TMCommandProtocol>command in self.commands) {
        [command execute];
    }
    [self.commands removeAllObjects];
}
//根据方法名称,动态加载执行对象的方法
- (void)addCommand:(NSString *)methodName {
    //获取到方法对象
    SEL method = NSSelectorFromString(methodName);
    //添加动态命令
    __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;
}

来自潭州课堂

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,904评论 1 32
  • 01 最近在看到《奇葩说》第三季有一期谈到是否该鼓励绝症病人活下去,现场的许多人泪如雨下。 的确,生死面前,都是小...
    胡圣荣阅读 3,749评论 3 2
  • 时光飞逝,转眼间孩子们已经入营四天。通过四天紧张充实的军营生活,小营员们已经蜕变成一名合格的特种兵小战士。他们在成...
    君临天下紫龙阅读 3,434评论 1 1
  • 2018.5.12 韩文萍 惊闻空姐遇劫难, 肩背拔凉心冒汗。 江歌冤魂犹悲戚, 花季空姐又喊冤。 当今社会怎么啦...
    含文在线阅读 2,312评论 0 0
  • 你要怎么过余生?我们在人生的路上,就会不停的被这个问题追问到。 也许我们还过很多的历史和人物传记,但是人家的人生,...
    国栋爱读书阅读 1,756评论 0 0

友情链接更多精彩内容