@protocol GameListener
-(void) gameStarted: (NSString *) name;
@end
@interface Game : NSObject{
@private NSMutableArray<id<GameListener>> *listeners;
}
@property NSString *name;
-(void) addListener: (id<GameListener>) listener;
-(void) start;
-(id) initWithName: (NSString *) name;
@end
@implementation Game
-(void) addListener: (id<GameListener>) listener {
[listeners addObject:listener];
}
-(void) start {
for (id<GameListener> listener in listeners) {
[listener gameStarted:self.name];
}
}
-(id) initWithName: (NSString *) name {
self = [super init];
if (self) {
self.name = name;
listeners = [NSMutableArray new];
}
return self;
}
@end
@interface Statistic : NSObject<GameListener>
@property int startsCount;
@property NSString *lastGame;
@end
@implementation Statistic
-(void) gameStarted: (NSString *) name {
self.startsCount++;
self.lastGame = name;
}
@end
Statistic *statistic = [Statistic new];
Game *heroes = [[Game alloc] initWithName: @"Heroes"];
Game *doom = [[Game alloc] initWithName: @"Doom"];
//subscribe to events
[heroes addListener: statistic];
[doom addListener: statistic];
[doom start];
[heroes start];
//statistic.lastGame is "Heroes"
//statistic.startsCount is 2