Представьте себе, что у нас есть что-то однотипное, к примеру у нас есть телефон и куча наушников. Если бы у каждого телефона был свой разъем, то мы могли бы пользоваться только одним типом наушников. Но Бог миловал! Собственно таже штука и с наушникам. Они могут выдавать различный звук, иметь различные дополнительные функции, но основная их цель – просто звучание:) И хорошо, что во многих случаях штекер у них одинаковый (я не говорю про различные студийные наушники:) ).
Собственно, Мост (Bridge) позволяет разделить абстракцию от реализации, так чтобы реализация в любой момент могла быть поменяна, не меняя при этом абстракции.
Когда использовать:
- Вам совершенно не нужна связь между абстракцией и реализацией.
- Собственно, как абстракцию так и имплементацию могут наследовать независимо.
- Вы не хотите чтобы изменения в реализации имело влияния на клиентский код.
Давайте создадим теперь базовую абстракцию наушников:
@interface ASBaseHeadphones : NSObject - (void)playSimpleSound; - (void)playBassSound; @end
И теперь два элемента – дорогие наушники и дешевые:)
Наушники обычные - китайские
@interface ASCheapHeadphones : ASBaseHeadphones @end
@implementation ASCheapHeadphones
#pragma mark - ASBaseHeadphones
- (void)playSimpleSound {
NSLog(@"beep - beep - bhhhrhrhrep");
}
- (void)playBassSound {
NSLog(@"puf - puf - pufhrrr");
}
@end
Наушники дорогие, тоже китайские
@interface ASExpensiveHeadphones : ASBaseHeadphones @end
@implementation ASExpensiveHeadphones
#pragma mark - ASBaseHeadphones
- (void)playSimpleSound {
NSLog(@"Beep-Beep-Beep Taram - Rararam");
}
- (void)playBassSound {
NSLog(@"Bam-Bam-Bam");
}
@end
И собственно плеер, через который мы будем слушать музыку:
@interface ASMusicPlayer : NSObject @property (nonatomic, strong) ASBaseHeadphones *headPhones; - (void)playMusic; @end
@implementation ASMusicPlayer
- (void)playMusic {
[self.headPhones playBassSound];
[self.headPhones playBassSound];
[self.headPhones playSimpleSound];
[self.headPhones playSimpleSound];
}
@end
Как видите, одно из свойств нашего плеера – наушники. Их можно подменять в любой момент, так как свойство того же типа, от которого наши дешевые и дорогие наушники наследуются. Тест!
ASMusicPlayer *player = [ASMusicPlayer new];
ASCheapHeadphones *cheap = [ASCheapHeadphones new];
ASExpensiveHeadphones *expensive = [ASExpensiveHeadphones new];
player.headPhones = cheap;
[player playMusic];
player.headPhones = expensive;
[player playMusic];
И конечно же лог:
2017-08-25 00:27:58.194 PatternsObjC[886:34176] puf - puf - pufhrrr 2017-08-25 00:27:58.194 PatternsObjC[886:34176] puf - puf - pufhrrr 2017-08-25 00:27:58.194 PatternsObjC[886:34176] beep - beep - bhhhrhrhrep 2017-08-25 00:27:58.195 PatternsObjC[886:34176] beep - beep - bhhhrhrhrep 2017-08-25 00:27:58.195 PatternsObjC[886:34176] Bam-Bam-Bam 2017-08-25 00:27:58.195 PatternsObjC[886:34176] Bam-Bam-Bam 2017-08-25 00:27:58.195 PatternsObjC[886:34176] Beep-Beep-Beep Taram - Rararam 2017-08-25 00:27:58.195 PatternsObjC[886:34176] Beep-Beep-Beep Taram - Rararam
Немає коментарів:
Дописати коментар