iOS 응용 디자인 모델 개발 에서 Mediator 중개자 모델 의 사용 에 대해 자세히 알 아 보기

6669 단어 iOS디자인 모드
무엇이 중개자 모델 입 니까?
    대상 을 대상 으로 하 는 디자인 은 행 위 를 서로 다른 대상 에 분산 시 키 도록 격려 하 는데 이런 분산 은 대상 간 의 상호 관 계 를 초래 할 수 있다.최 악의 경우 모든 대상 이 서 로 를 이해 하고 조작 한다.
    행 위 를 서로 다른 대상 에 분산 시 켜 재 활용 성 을 높 였 지만 상호 관련 성 이 증가 하면 서 얻 는 이점 이 줄 어 들 었 다.증가 하 는 관련 성 으로 인해 대상 은 다른 대상 에 게 의존 하지 않 고 일 하기 어렵 거나 할 수 없다.응용 프로그램의 전체적인 행 위 는 많은 대상 에 분포 되 어 있 기 때문에 중대 한 수정 을 하기 어 려 울 수 있다.따라서 프로그램 에서 의 모든 새로운 행동 을 지원 하기 위해 점점 더 많은 하위 클래스 를 만 들 수 있 습 니 다.
    중개자 모드:한 대상 으로 일련의 대상 의 상호작용 방식 을 밀봉 합 니 다.중개 자 는 각 대상 이 명시 적 으로 서로 인용 하지 않 아 도 되 고 결합 을 느슨 하 게 하 며 독립 적 으로 그들의 상호작용 을 바 꿀 수 있다.
중개 자 모드 는 언제 사용 합 니까?
1.대상 간 의 상호작용 은 명확 하고 복잡 하지만 한 그룹의 대상 이 서로 의존 하고 이해 하기 어렵다.
2.대상 이 다른 대상 을 많이 인용 하고 통신 하기 때문에 대상 을 재 활용 하기 어렵다.
3.여러 가지 유형 에 분포 되 어 있 는 논리 나 행 위 를 맞 추 려 면 너무 많은 하위 클래스 를 만 들 고 싶 지 않다.
중개자 모델 의 실현 예시:
다음은 먼저 유형 구조 도 를 제시 한 다음 에 간단하게 설명 한다.
2016330175627742.jpg (500×365)
중개자 모델 은 시스템 에서 인용 하기 쉽 지만 오용 하기 쉽다.그래서 시스템 에'다 대 다'의 상호작용 이 복잡 한 대상 군 이 나 타 났 을 때 중개 자 모델 을 급히 사용 하지 말고 시스템 이 디자인 에 있어 합 리 적 인지 반성 해 야 한다.
다음은 중개자 모델 의 장단 점 을 살 펴 보 자.중개인 의 장점 은 먼저 Mediator 의 등장 이 각 Colleague 의 결합 을 감소 시 켜 각 Colleague 류 와 Mediator 를 독립 적 으로 바 꾸 고 재 활용 할 수 있다 는 것 이다.그 다음으로 대상 이 어떻게 협력 하 는 지 추상 적 으로 하기 때문에 중 개 를 독립 적 인 개념 으로 하고 이 를 한 대상 에 밀봉 한다.이런 관심 대상 은 대상 각자 의 행위 에서 그들의 상호작용 으로 이전 한다.즉,더욱 거시적인 각도 에서 시스템 을 보 는 것 이다.
상대 적 으로 단점 도 뚜렷 하 다.Concrete Mediator 가 집중 화 를 통 제 했 기 때문에 상호작용 의 복잡성 을 중개자 의 복잡성 으로 바 꾸 었 기 때문에 중개자 가 그 어떠한 Concrete Colleage 보다 복잡 해 질 것 이다.그래서 Concrete Mediator 가 무 너 지면 시스템 전체 가 영향 을 받는다.
역시 그 옛말,세상 에 은 탄 이 없 으 니,적당 한 것 이 가장 좋다!
구체 적 인 실현 을 간단히 보 여 드 리 겠 습 니 다.
주의:본 논문 의 모든 코드 는 ARC 환경 에서 컴 파일 되 었 습 니 다.
Mediator 클래스 인터페이스

#import <Foundation/Foundation.h>

@class Colleague;
@interface Mediator :NSObject
-(void)Send:(NSString*)message
           :(Colleague*)colleague;
@end

Mediator 클래스 구현

#import "Mediator.h"

@implementation Mediator
-(void)Send:(NSString *)message :(Colleague *)colleague{
    return;
}
@end

Colleague 클래스 인터페이스

#import <Foundation/Foundation.h>

@class Mediator;
@interface Colleague :NSObject{
    Mediator *myMediator;
}
-(Colleague*)MyInit:(Mediator*)mediator;
@end

Colleague 클래스 구현

#import "Colleague.h"

@implementation Colleague
-(Colleague*)MyInit:(Mediator *)mediator{
    if (self == [super init]) {
        myMediator = mediator;
    }
    return self;
}
@end

ConcreteMediator 클래스 인터페이스

#import "Mediator.h"

@class ConcreteColleague1;
@class ConcreteColleague2;
@interface ConcreteMediator :Mediator
@property ConcreteColleague1*colleague1;
@property ConcreteColleague2*colleague2;
@end

ConcreteMediator 클래스 구현

#import "ConcreteMediator.h"
#import "ConcreteColleague1.h"
#import "ConcreteColleague2.h"
#import "Colleague.h"

@implementation ConcreteMediator
@synthesize colleague1;
@synthesize colleague2;

-(void)Send:(NSString *)message :(Colleague *)colleague{
    if ([colleague isKindOfClass:[ConcreteColleague1 class]]) {
        [colleague2 Notify:message];
    }
    else {
        [colleague1 Notify:message];
    }
}
@end

Concrete Colleague 1 클래스 인터페이스

#import "Colleague.h"

@class Mediator;
@interface ConcreteColleague1 :Colleague
-(ConcreteColleague1*)MyInit:(Mediator*)mediator;
-(void)Send:(NSString*)message;
-(void)Notify:(NSString*)message;
@end

Concrete Colleague 1 류 실현

#import "ConcreteColleague1.h"
#import "Mediator.h"

@implementation ConcreteColleague1
-(ConcreteColleague1*)MyInit:(Mediator*)mediator{
    if (self == [super init]) {
        myMediator = mediator;
    }
    return self;
}
-(void)Send:(NSString *)message{
    [myMediator Send:message :self];
}
-(void)Notify:(NSString *)message{
    NSLog(@"ConcreteColleague1 got message:%@", message);
}
@end

Concrete Colleague 2 클래스 인터페이스

#import "Colleague.h"

@class Mediator;
@interface ConcreteColleague2 :Colleague
-(ConcreteColleague2*)MyInit:(Mediator*)mediator;
-(void)Send:(NSString*)message;
-(void)Notify:(NSString*)message;
@end
ConcreteColleague2

#import "ConcreteColleague2.h"
#import "Mediator.h"

@implementation ConcreteColleague2
-(ConcreteColleague2*)MyInit:(Mediator*)mediator{
    if (self == [super init]) {
        myMediator = mediator;
    }
    return self;
}
-(void)Send:(NSString *)message{
    [myMediator Send:message :self];
}
-(void)Notify:(NSString *)message{
    NSLog(@"ConcreteColleague2 got message:%@", message);
}
@end

메 인 방법 호출

#import <Foundation/Foundation.h>
#import "ConcreteMediator.h"
#import "ConcreteColleague1.h"
#import "ConcreteColleague2.h"

int main(int argc,const char * argv[])
{
    @autoreleasepool{
        ConcreteMediator *m = [[ConcreteMediator alloc]init];
        ConcreteColleague1 *c1 = [[ConcreteColleague1 alloc]MyInit:m];
        ConcreteColleague2 *c2 = [[ConcreteColleague2 alloc]MyInit:m];
        [m setColleague1:c1];
        [m setColleague2:c2];
        [c1 Send:@"Good morning"];
        [c2 Send:@"Good afternoon"];
    }
    return 0;
}

완공!

좋은 웹페이지 즐겨찾기