面试题答案
一键面试中介者模式主要角色及职责
- 中介者(Mediator):定义一个接口用于与各同事对象通信。它协调各个同事对象之间的交互,使同事对象之间解耦,避免了它们之间的直接相互引用。
- 同事(Colleague):所有同事类的抽象基类,定义了一个抽象的通信方法,每个具体同事类都通过这个方法与中介者通信。
- 具体同事(ConcreteColleague):继承自同事类,实现了与中介者通信的具体方法。具体同事类只知道中介者,而不知道其他具体同事类,它们之间的交互通过中介者进行。
中介者角色在Objective - C中的代码实现示例
假设我们有一个聊天系统,用户(具体同事)之间通过聊天服务器(中介者)进行消息交互。
- 首先定义中介者协议
@protocol ChatRoomMediatorProtocol <NSObject>
- (void)sendMessage:(NSString *)message from:(id)sender;
@end
- 然后定义同事基类
@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
- 接着实现具体的中介者(聊天服务器)
@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
- 使用示例
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
类通过中介者进行通信,而不是直接相互引用。