디자인 모드 에서 의 명령 모드 가 iOS App 개발 에서 의 인 스 턴 스 설명

7713 단어 디자인 모드iOS
명령 모드 에서 요청 이나 행동 을 대상 으로 봉인 합 니 다.패 키 징 요청 은 원래 의 것 보다 더욱 유연 하 며 대상 간 에 전달,저장,동적 수정 또는 하나의 대기 열 에 넣 을 수 있 습 니 다.
그럼 명령 모드 의 특징 을 간략하게 말씀 드 리 겠 습 니 다.
  • 명령 대기 열 을 비교적 쉽게 설계 할 수 있다
  • 4.567917.필요 한 경우 명령 을 로그 에 쉽게 기록 할 수 있 습 니 다
  • 요 구 를 받 아들 일 수 있 는 한 측 이 요 구 를 거부 할 지 여 부 를 결정 한다
  • 4.567917.요청 에 대한 취소 와 재 작업 을 쉽게 실현 할 수 있다4.567917.새로운 구체 적 인 명령 류 를 추가 하 는 것 은 다른 유형 에 영향 을 주지 않 기 때문에 새로운 구체 적 인 명령 류 를 추가 하 는 것 이 쉽다4.567917.작업 을 요청 하 는 대상 과 작업 을 어떻게 수행 하 는 지 아 는 대상 을 분리 합 니 다다음은 기본 적 인 클래스 구성 도 를 보 여 줍 니 다.
    201632492123555.jpg (448×315)
    위의 이 그림 은 명령 모드 의 클래스 구조의 기본 그림 이다.사실 이 그림 에서 많은 것 을 확장 할 수 있 습 니 다.디 테 일 은 말 하지 않 겠 습 니 다.여러분 에 게 상상 할 수 있 는 공간 을 남 겨 드 리 겠 습 니 다.하하!
    아니면 낡은 규칙 입 니까?다음은 실례 를 드 리 겠 습 니 다.
    Objective-C 예제:
    Command:

    //
    //  NimoCommand.h
    //  CommandDemo
    //
     
    #import <Foundation/Foundation.h>
     
    @protocol NimoCommand <NSObject>
     
    - (void)execute;
     
    @end
    ConcreteCommand:

    //
    //  NimoConcreteCommand.h
    //  CommandDemo
    //
    #import <Foundation/Foundation.h>
    #import "NimoCommand.h"
    @class NimoReceiver;
     
    @interface NimoConcreteCommand : NSObject <NimoCommand>
     
    @property (nonatomic) NimoReceiver *receiver;
     
    - (id)initWithReceiver:(NimoReceiver *)receiver;
     
    @end

    //
    //  NimoConcreteCommand.m
    //  CommandDemo
    //
     
    #import "NimoConcreteCommand.h"
    #import "NimoReceiver.h"
     
     
    @implementation NimoConcreteCommand
     
    - (void)execute
    {
        [_receiver action];
    }
     
    - (id)initWithReceiver:(NimoReceiver *)receiver
    {
        if (self = [super init]) {
            _receiver = receiver;
        }
        
        return self;
    }
     
    @end
    Receiver:

    //
    //  NimoReceiver.h
    //  CommandDemo
    //

    #import <Foundation/Foundation.h>
     
    @interface NimoReceiver : NSObject
     
    - (void)action;
     
    @end


    //
    //  NimoReceiver.m
    //  CommandDemo
    //

    #import "NimoReceiver.h"
     
    @implementation NimoReceiver
     
    - (void)action
    {
        NSLog(@" ");
    }
     
    @end

    Invoker:

    //
    //  NimoInvoker.h
    //  CommandDemo
    //
     
    #import <Foundation/Foundation.h>
    #import "NimoCommand.h"
     
    @interface NimoInvoker : NSObject
     
    @property (nonatomic, weak) id<NimoCommand> command;
     
    - (void)executeCommand;
     
    @end

    //
    //  NimoInvoker.m
    //  CommandDemo
    //
     
    #import "NimoInvoker.h"
     
     
    @implementation NimoInvoker
     
    - (void)executeCommand
    {
        [_command execute];
    }
     
    @end
    Client:

    //
    //  main.m
    //  CommandDemo
    //

    #import <Foundation/Foundation.h>
    #import "NimoReceiver.h"
    #import "NimoInvoker.h"
    #import "NimoConcreteCommand.h"
     
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
           
            NimoReceiver *receiver = [[NimoReceiver alloc] init];
            NimoConcreteCommand *command = [[NimoConcreteCommand alloc] initWithReceiver:receiver];
            
            NimoInvoker *invoker = [[NimoInvoker alloc] init];
            invoker.command = command;
            [invoker executeCommand];
            
        }
        return 0;
    }

    Running:
    
    2015-08-13 22:49:56.412 CommandDemo[1385:43303]     
    
    Cocoa Touch 프레임 의 명령 모드:
    NSInvocation 대상
    다음 예제 에서 클 라 이언 트 는 Receiver 를 직접 호출 하 는 방법 이 아니 라 NSInvocation 대상 으로 실행 시 라 이브 러 리 가 Receiver 에 실행 메 시 지 를 보 내 는 데 필요 한 모든 정 보 를 패키지 합 니 다.이 NSInvocation 대상 은 위의 Concretecond 대상 과 유사 합 니 다.
    Receiver:

    //
    //  NimoReceiver.h
    //  InvocationDemo
    //

    #import <Foundation/Foundation.h>
     
    @interface NimoReceiver : NSObject
     
    - (int)printWithName:(NSString *)name gender:(NSString *)gender age:(int)age;
     
    @end


    //
    //  NimoReceiver.m
    //  InvocationDemo
    //

    #import "NimoReceiver.h"
     
    @implementation NimoReceiver
     
    - (int)printWithName:(NSString *)name gender:(NSString *)gender age:(int)age
    {
        NSLog(@"My name is %@, %@, %d years old.", name, gender, age);
        return 119;
    }
     
    @end

    Client:

    //
    //  main.m
    //  InvocationDemo
    //

    #import <Foundation/Foundation.h>
    #import "NimoReceiver.h"
     
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            
            // Receiver NSInvocation , Receiver action
            NimoReceiver *receiver = [[NimoReceiver alloc] init];
            NSString *name = @"Lee";
            NSString *gender = @"male";
            int age = 28;
            SEL sel = @selector(printWithName:gender:age:);
            NSMethodSignature *methodSignature = [[receiver class] instanceMethodSignatureForSelector:sel];
            NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature];
            [invocation setTarget:receiver];
            [invocation setSelector:sel];
            [invocation setArgument:&name atIndex:2];
            [invocation setArgument:&gender atIndex:3];
            [invocation setArgument:&age atIndex:4];
            [invocation retainArguments];
            [invocation invoke]; // NSInvocation invoke , Receiver action
            
            int returnValue = 0;
            [invocation getReturnValue:&returnValue];
            
            NSLog(@"returnValue: %d", returnValue);
        }
        return 0;
    }

    Running:
    
    2015-08-14 13:37:44.162 InvocationDemo[1049:36632] My name is Lee, male, 28 years old.
    2015-08-14 13:37:44.164 InvocationDemo[1049:36632] returnValue: 119
    
    
    사실 클래스 관계 도 에서 쉽게 알 수 있 듯 이 명령 모드 는 수요(Invoker)와 구체 적 인 실현(Receiver)을 명령 층(Command)을 통 해 결합 시 켰 다.구체 적 인 실현 과정 은 명령 에 따라 구분 되 었 다.

    좋은 웹페이지 즐겨찾기