Представьте себе, что у нас есть что-то однотипное, к примеру у нас есть телефон и куча наушников. Если бы у каждого телефона был свой разъем, то мы могли бы пользоваться только одним типом наушников. Но Бог миловал! Собственно таже штука и с наушникам. Они могут выдавать различный звук, иметь различные дополнительные функции, но основная их цель – просто звучание:) И хорошо, что во многих случаях штекер у них одинаковый (я не говорю про различные студийные наушники:) ).
Собственно, Мост (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
Немає коментарів:
Дописати коментар