iOS 와 관찰자 모드 (2)

2855 단어
지난 편 은 관찰자 모델 의 개념 에 대한 토론 이 었 습 니 다. 이 편 은 통 지 를 이용 하여 관찰자 모델 을 실현 하 는 것 이 었 습 니 다. 잘못된 점 은 비판 과 지적 을 바 랍 니 다.
코드 예제
iOS 에서 일상적인 개발 에 서 는 코코아 터치 프레임 워 크 알림 과 KVO 모두 관찰자 모드 를 구현 했다.다음 에 작은 강 은 두 가지 모델 로 간단하게 실현 하면 구체 적 인 통지 와 kvo 의 원 리 는 여기 서 군말 하지 않 을 것 이다. 디자인 모델 의 중심 이 아니 기 때문이다.
알림 실현
//          ,          
@interface Bell : NSObject
- (void)attachObserver:(Observer *)observer;
- (void)classBegin;
- (void)classEnd;
@property (nonatomic, strong) NSMutableArray *observers;
@end

@implementation Bell
- (void)attachObserver:(Observer *)observer {
//         ,  ios            ,                
    [self.observers addObject:observer];
}

- (void)classBegin {
  NSLog(@"     ");
  NSDictionary *dic = @{@"classBegin":@YES};
  [[NSNotificationCenter defaultCenter] postNotificationName:@"classBellRing" 
                                                       object:self userInfo:dic];
}

- (void)classEnd {
    NSLog(@"     ");
    NSDictionary *dic = @{@"classBegin":@NO};
    [[NSNotificationCenter defaultCenter] postNotificationName:@"classBellRing" 
                                                        object:self userInfo:dic];
 }
@end

//       
@interface Observer : NSObject
- (void)update:(NSNotification *)notification;
@end

@implementation Observer
- (id)init {
    self = [super init];
    if (self) {
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(update:) name:@"classBellRing" object:nil];
    }
    return self;
}

- (void)update:(NSNotification *)notification {
   //to be Override...
}

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:@"classBellRing"];
}
@end

//       
@interface Student : Observer
@end

@implementation Student
- (void)update:(NSNotification *)notification {
    NSDictionary *userInfo =  notification.userInfo;
    if ([[userInfo objectForKey:@"classBegin"] boolValue]) {
        [self classBegin];
    } else {
        [self classEnd];
    }
}

- (void)classBegin {
    NSLog(@"   ,      ");
}

- (void)classEnd {
    NSLog(@"   ,      ");
}
@end

//     
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //     
        Bell *bell = [[Bell alloc] init];
        Student *stu1 = [[Student alloc] init];
        [bell attachObserver:stu1];
        [bell classBegin];
        [bell classEnd];
    }
    return 0;
}

실행 결과:
2017-01-06 23:37:49.022 DesignPattern[3309:91471]      
2017-01-06 23:37:49.023 DesignPattern[3309:91471]    ,      
2017-01-06 23:37:49.023 DesignPattern[3309:91471]      
2017-01-06 23:37:49.023 DesignPattern[3309:91471]    ,      
Program ended with exit code: 0

이상, 문제 가 있 으 면 지적 하여 주시 기 바 랍 니 다 ~ 본문 과 작가 의 오리지널, 전재 출처 를 밝 혀 주 십시오.

좋은 웹페이지 즐겨찾기