首先犹赖,什么是橋接模式呢?
想到公司有個面試題是有關花和蜜蜂的卷仑,花開蜜蜂來采蜜峻村,花謝蜜蜂回巢。把這個場景改造下锡凝,來說明今天的主題:
花園里有牽耪匙颍花,花開的時候蜜蜂來采蜜
那么我們可能就會這樣來設計:
@interface QianniuHua : NSObject
@property (nonatomic, strong) Bee *bee;
- (void)bloom;
@end
突然有一天窜锯,花園里多了牡丹花张肾,牡丹花開的時候蝴蝶會來采蜜
這個簡單,我們再增加一個牡丹花類就好了:
@interface MudanHua : NSObject
@property (nonatomic, strong) Butterfly *butterfly;
- (void)bloom;
@end
那么接下來呢锚扎?花園里的花會越來越多吞瞪,昆蟲也會越來越多。更重要的是驾孔,牽攀龋花蜜并不一定是由蜜蜂來采,蝴蝶也不一定單單只喜歡牡丹花助币。所以要實現(xiàn)的是牽牛花與蜜蜂的解耦螟碎,蝴蝶與牡丹花的解耦眉菱。牡丹花可以由蜜蜂蝴蝶飛蛾蜂鳥來采蜜,蜜蜂也可以去采集牡丹花牽诺舴郑花槐花蜜俭缓】艘粒花有不同的類型,昆蟲有不同的種類华坦,那么如何設計才能適應兩方面的變化呢愿吹?
這就是今天想要介紹的橋接模式:
在軟件系統(tǒng)中,某些類型由于自身的邏輯惜姐,它具有兩個或多個維度的變化犁跪,那么如何應對這種“多維度的變化”?如何利用面向?qū)ο蟮募夹g來使得該類型能夠輕松的沿著多個方向進行變化歹袁,而又不引入額外的復雜度坷衍?這就要使用Bridge模式。
將抽象部分與實現(xiàn)部分分離条舔,使它們都可以獨立的變化枫耳。
——《設計模式》GOF
具體的結(jié)構如下:
橋接模式
圖中可以看到
- Abstraction是一個虛基類,Operation()調(diào)用Implemetor的OperationImp()方法
- Implemetor父類有兩個子類A和B孟抗。
- 兩個基類間的關系是聚合關系迁杨,Abstrction是整體,Implementor是部分凄硼,說白了就是Implementor是Abstraction的成員變量铅协。
好了,下面用橋接模式來實現(xiàn)下面這個比較簡單的場景:
花園里有一朵牽欧花和一朵牡丹花警医,牽牛花開會吸引蜜蜂來采蜜坯钦,牡丹花開會吸引蝴蝶來采蜜
@interface AbstractInsect : NSObject
- (void)bloomImp;
@end
@interface AbstractFlower : NSObject
@property (nonatomic, strong) AbstractInsect *insect;
- (void)bloom;
@end
@interface QianniuHua : AbstractFlower
@end
@implementation QianniuHua
- (void)boom {
NSLog(@"牽旁せ剩花開了");
[self.insect bloomImp];
}
@end
@interface MudanHua : AbstractFlower
@end
@implementation MudanHua
- (void)bloom {
NSLog(@"牡丹花開了");
[self.insect bloomImp];
}
@end
@interface Butterfly : AbstractInsect
@end
@implementation Butterfly
- (void)bloomImp {
NSLog(@"蝴蝶來了");
}
@end
@interface Bee : AbstractInsect
@end
@implementation Bee
- (void)bloomImp {
NSLog(@"蜜蜂來了");
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
QianniuHua *qianniu = [[QianniuHua alloc] init];
qianniu.insect = [[Bee alloc] init];
[qianniu bloom];
MudanHua *mudan = [[MudanHua alloc] init];
mudan.insect = [[Butterfly alloc] init];
[mudan bloom];
}
return 0;
}
運行結(jié)果:
2016-12-08 23:45:46.281 DesignPattern[10832:226597] 牽牛花開了
2016-12-08 23:45:46.282 DesignPattern[10832:226597] 蜜蜂來了
2016-12-08 23:45:46.282 DesignPattern[10832:226597] 牡丹花開了
2016-12-08 23:45:46.282 DesignPattern[10832:226597] 蝴蝶來了
以上就是一個比較簡單的橋接模式婉刀,如果有什么理解不當?shù)牡胤揭魑拢瑲g迎批評指正!
本文系作者原創(chuàng)突颊,轉(zhuǎn)載請注明出處