iOS 응용 디자인 모델 개발 에서 Mediator 중개자 모델 의 사용 에 대해 자세히 알 아 보기
대상 을 대상 으로 하 는 디자인 은 행 위 를 서로 다른 대상 에 분산 시 키 도록 격려 하 는데 이런 분산 은 대상 간 의 상호 관 계 를 초래 할 수 있다.최 악의 경우 모든 대상 이 서 로 를 이해 하고 조작 한다.
행 위 를 서로 다른 대상 에 분산 시 켜 재 활용 성 을 높 였 지만 상호 관련 성 이 증가 하면 서 얻 는 이점 이 줄 어 들 었 다.증가 하 는 관련 성 으로 인해 대상 은 다른 대상 에 게 의존 하지 않 고 일 하기 어렵 거나 할 수 없다.응용 프로그램의 전체적인 행 위 는 많은 대상 에 분포 되 어 있 기 때문에 중대 한 수정 을 하기 어 려 울 수 있다.따라서 프로그램 에서 의 모든 새로운 행동 을 지원 하기 위해 점점 더 많은 하위 클래스 를 만 들 수 있 습 니 다.
중개자 모드:한 대상 으로 일련의 대상 의 상호작용 방식 을 밀봉 합 니 다.중개 자 는 각 대상 이 명시 적 으로 서로 인용 하지 않 아 도 되 고 결합 을 느슨 하 게 하 며 독립 적 으로 그들의 상호작용 을 바 꿀 수 있다.
중개 자 모드 는 언제 사용 합 니까?
1.대상 간 의 상호작용 은 명확 하고 복잡 하지만 한 그룹의 대상 이 서로 의존 하고 이해 하기 어렵다.
2.대상 이 다른 대상 을 많이 인용 하고 통신 하기 때문에 대상 을 재 활용 하기 어렵다.
3.여러 가지 유형 에 분포 되 어 있 는 논리 나 행 위 를 맞 추 려 면 너무 많은 하위 클래스 를 만 들 고 싶 지 않다.
중개자 모델 의 실현 예시:
다음은 먼저 유형 구조 도 를 제시 한 다음 에 간단하게 설명 한다.
중개자 모델 은 시스템 에서 인용 하기 쉽 지만 오용 하기 쉽다.그래서 시스템 에'다 대 다'의 상호작용 이 복잡 한 대상 군 이 나 타 났 을 때 중개 자 모델 을 급히 사용 하지 말고 시스템 이 디자인 에 있어 합 리 적 인지 반성 해 야 한다.
다음은 중개자 모델 의 장단 점 을 살 펴 보 자.중개인 의 장점 은 먼저 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;
}
완공!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
View의 레이아웃 방법을 AutoLayout에서 따뜻한 손 계산으로 하면 성능이 9.26배로 된 이야기이 기사는 의 15 일째 기사입니다. 어제는 에서 이었습니다. 손 계산을 권하는 의도는 없고, 특수한 상황하에서 계측한 내용입니다 화면 높이의 10 배 정도의 contentView가있는 UIScrollView 레이아...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.