MST

星途 面试题库

面试题:Objective-C中中介者模式的基本结构

请简述在Objective-C中,中介者模式由哪些主要角色构成,并说明每个角色在该模式中的职责,同时结合Objective-C语言特性,举例说明中介者角色的代码实现方式。
23.7万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

中介者模式主要角色及职责

  1. 中介者(Mediator):定义一个接口用于与各同事对象通信。它协调各个同事对象之间的交互,使同事对象之间解耦,避免了它们之间的直接相互引用。
  2. 同事(Colleague):所有同事类的抽象基类,定义了一个抽象的通信方法,每个具体同事类都通过这个方法与中介者通信。
  3. 具体同事(ConcreteColleague):继承自同事类,实现了与中介者通信的具体方法。具体同事类只知道中介者,而不知道其他具体同事类,它们之间的交互通过中介者进行。

中介者角色在Objective - C中的代码实现示例

假设我们有一个聊天系统,用户(具体同事)之间通过聊天服务器(中介者)进行消息交互。

  1. 首先定义中介者协议
@protocol ChatRoomMediatorProtocol <NSObject>
- (void)sendMessage:(NSString *)message from:(id)sender;
@end
  1. 然后定义同事基类
@interface User : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, weak) id<ChatRoomMediatorProtocol> mediator;
- (instancetype)initWithName:(NSString *)name mediator:(id<ChatRoomMediatorProtocol>)mediator;
- (void)sendMessage:(NSString *)message;
- (void)receiveMessage:(NSString *)message from:(NSString *)senderName;
@end

@implementation User
- (instancetype)initWithName:(NSString *)name mediator:(id<ChatRoomMediatorProtocol>)mediator {
    self = [super init];
    if (self) {
        _name = name;
        _mediator = mediator;
    }
    return self;
}

- (void)sendMessage:(NSString *)message {
    [self.mediator sendMessage:message from:self];
}

- (void)receiveMessage:(NSString *)message from:(NSString *)senderName {
    NSLog(@"%@ received message from %@: %@", self.name, senderName, message);
}
@end
  1. 接着实现具体的中介者(聊天服务器)
@interface ChatRoomMediator : NSObject <ChatRoomMediatorProtocol>
@property (nonatomic, strong) NSMutableArray<User *> *users;
- (instancetype)init;
- (void)addUser:(User *)user;
- (void)sendMessage:(NSString *)message from:(id)sender;
@end

@implementation ChatRoomMediator
- (instancetype)init {
    self = [super init];
    if (self) {
        _users = [NSMutableArray array];
    }
    return self;
}

- (void)addUser:(User *)user {
    [self.users addObject:user];
}

- (void)sendMessage:(NSString *)message from:(id)sender {
    for (User *user in self.users) {
        if (user != sender) {
            [user receiveMessage:message from:((User *)sender).name];
        }
    }
}
@end
  1. 使用示例
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        ChatRoomMediator *chatRoom = [[ChatRoomMediator alloc] init];
        User *user1 = [[User alloc] initWithName:@"Alice" mediator:chatRoom];
        User *user2 = [[User alloc] initWithName:@"Bob" mediator:chatRoom];
        [chatRoom addUser:user1];
        [chatRoom addUser:user2];
        [user1 sendMessage:@"Hello, Bob!"];
    }
    return 0;
}

在上述代码中,ChatRoomMediator 作为中介者,协调 User 之间的消息发送,User 类通过中介者进行通信,而不是直接相互引用。