iOS 개발 - 대상 간 통신의 에이전트 프로토콜

3745 단어 iOS 개발
1. 프록시가 대상 간의 통신을 실현한다.
누가 대리 대상이고 누가 피대리 대상인지 확정하다.
사건은 어디에서 발생했습니까?누가 피대리 대상인가
이벤트는 어디에서 응답합니까?대리인
 
요구 사항:
예: 가정부가 아이를 돌보고, 아이가 더러워질 때 청결하게 해주고, 아이가 기분이 좋지 않을 때 놀아준다.
프록시 클래스 차일드
프록시 속성 정의 (id) 및 이 프록시 속성은 프로토콜을 준수해야 합니다
이벤트가 발생할 때, 이 이벤트에 응답하기 위해 프록시 속성의 프로토콜 방법을 호출해야 합니다.
 
프록시 클래스 Nanny
협의를 준수해야 한다
프로토콜 방법을 실현하려면 프로토콜 방법의 내용은 이벤트에 대한 응답이다.
대리 디자인 모델 해결은 프로그램 구조상의 문제로 프로그램 구조를 더욱 합리적이고 확장성을 가지며 클래스와 클래스 이전의 결합성을 낮춘다.
필요한 객체:
프록시 대상: Nanny, Grandma
프록시된 객체:차일드
 
프로세스:
 1.프로토콜을 정의합니다. 프로토콜에 몇 가지 방법을 설명합니다.
 2.에이전트가 프로토콜을 준수하는 것을 정의합니다. 프로토콜의 모든 방법에 대한 성명을 포함합니다.
 3.프록시 클래스에 프록시 대상을 정의해야 합니다. 일반적인 형식 id< 프로토콜 이름 > delegate로 설정합니다.
 4.프록시 대상이 이 기능을 완성하지 못할 때 프록시 대상에게 프록시 클래스에서 이루어진 프로토콜 방법을 호출해서 완성하도록 알려 줍니다.
 
프로토콜 클래스 설정
#import 

@class Child;

//       ,                 
@protocol CareBabyProtocol 

//     
- (void)batheChild:(Child *)child;


//     
- (void)playWithChild:(Child *)child;

@end

어린이 클래스에서 프록시 대상 정의
#import "CareBabyProtocol.h"
#import 




@interface Child : NSObject


@property NSInteger cleanValue; //   
@property NSInteger happyValue; //   

//               ,         id delegate;
//          (id)     ,         
@property id delegate;



- (instancetype)initWithCleanValue:(NSInteger)cleanValue happyValue:(NSInteger)happyValue;

@end

아이가 불결하거나 기분 나쁠 때 대리하는 방법.
#import "Child.h"


@implementation Child

- (instancetype)initWithCleanValue:(NSInteger)cleanValue happyValue:(NSInteger)happyValue {
    
    self = [super init];
    
    if (self) {
        
        NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];
        
        _cleanValue = cleanValue;
        
        _happyValue = happyValue;
        
        
    }
    
    return self;
}

- (void)timerAction:(NSTimer *)timer {
    
    _cleanValue--;
    _happyValue--;
    
    NSLog(@"clean:%li, happy:%li", _cleanValue, _happyValue);
    
    //               ,         
    if (_cleanValue == 95) {
        
        [self.delegate batheChild:self];
        
        
    }
    
    if (_happyValue == 90) {
        [self.delegate playWithChild:self];
    }
    
}



@end

대리 대상 가정부를 정의하고 가정부가 협의에 서명하도록 합니다
#import "CareBabyProtocol.h"
#import 

@class Child;

@interface Nanny : NSObject 



@end

가정부의 협의 방법이 실현되다
#import "Nanny.h"
#import "Child.h"

@implementation Nanny


- (void)batheChild:(Child *)child {
    
    NSLog(@"    ,        ");
    child.cleanValue = 100;
    
}


- (void)playWithChild:(Child *)child {
    
    NSLog(@"     ,      ");
    child.happyValue = 100;
    
}

@end

main에서 아이 대상과 대리 대상(보모) 열기
#import "Child.h"
#import "Nanny.h"
#import "Grandma.h"
#import 

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        
        //Nanny *nanny = [[Nanny alloc] init];
        Grandma *grandma = [[Grandma alloc] init];
        
        Child *child = [[Child alloc] initWithCleanValue:100 happyValue:100];
        
        //            
        //child.nanny = nanny;
        
        //            
        child.delegate = grandma;
        
        
        [[NSRunLoop currentRunLoop] run];
        
        
        
    }
    return 0;
}

좋은 웹페이지 즐겨찾기