美文网首页
命令模式三:动态命令

命令模式三:动态命令

作者: 沫粢泪虞 | 来源:发表于2019-04-28 12:13 被阅读0次

动态命令:我们不需要新建各种命令类 (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;
}

来自潭州课堂

相关文章

  • 命令模式三:动态命令

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

  • 第5章 -行为型模式-命令模式

    一、命令模式的简介 二、命令模式的优缺点 三、命令模式的实例

  • 五、Linux vim编辑器

    vim编辑器三种模式:命令模式、编辑模式、末行模式 1.命令模式: vim进入文件后就是命令模式 1.1 命令模式...

  • vi的三种模式

    vi 三种模式 vi的三种模式为命令模式,编辑模式,尾行模式 命令模式 命令模式(默认),按下esc即可,可以执行...

  • 行为型模式:命令模式

    LieBrother原文:行为型模式:命令模式 十一大行为型模式之三:命令模式。 简介 姓名 :命令模式 英文名 ...

  • vim常用命令的使用

    vim三种模式 命令模式 末行模式 输入模式 命令模式 当刚刚启动vim时就为该模式命令模式 该模式下所敲击的键盘...

  • VIM使用常用命令

    vim常用命令vim三种模式:命令模式、插入模式、编辑模式。使用ESC或i或:来切换模式。 命令模式(按ESC)下...

  • linux命令行学习(46):vi的三种模式及切换方法

    vi/vim共分为三种模式,分别是命令模式,输入模式和底线命令模式。 一、命令模式 用户刚刚启动vi/vim,便进...

  • vim常用命令

    vim有三种模式:插入模式输入文本,编辑模式(也称为正常模式)执行命令,命令模式执行冒号命令 正常模式为缺省模式,...

  • Vi命令使用

    1:首先知道vi三种模式: 命令模式、文本输入模式、末行模式 (1):命令模式,该模式下只接受vi命令,若输入的字...

网友评论

      本文标题:命令模式三:动态命令

      本文链接:https://www.haomeiwen.com/subject/exmygqtx.html