пʼятниця, 25 серпня 2017 р.

Bridge

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

Собственно, Мост (Bridge) позволяет разделить абстракцию от реализации, так чтобы реализация в любой момент могла быть поменяна, не меняя при этом абстракции.

Когда использовать:

  1. Вам совершенно не нужна связь между абстракцией и реализацией.
  2. Собственно, как абстракцию так и имплементацию могут наследовать независимо.
  3. Вы не хотите чтобы изменения в реализации имело влияния на клиентский код.

Давайте создадим теперь базовую абстракцию наушников:

@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

Немає коментарів:

Дописати коментар

HyperComments for Blogger

comments powered by HyperComments