定義
橋接模式是將抽象部分與它的實現(xiàn)部分分離,使它們都可以獨立地變化闺鲸。它是一種對象結(jié)構(gòu)型模式,又稱為柄體(Handle and Body)模式或接口(Interface)模式谆棺。
通過提供抽象化和實現(xiàn)化之間的橋接結(jié)構(gòu)疚沐,來實現(xiàn)二者的解耦站玄。
角色
實現(xiàn)(Implementor):定義具體行為,具體特征的應(yīng)用接口濒旦。
具體實現(xiàn)(ConcreteImplementor):實現(xiàn)Implementor。
目標(biāo)接口(Target): 包含實現(xiàn)具體行為再登、具體特征的Implementor接口或者類尔邓。
場景模擬
我們假設(shè)有一座橋,橋左邊為A锉矢,橋右邊為B梯嗽,A有A1,A2沽损,A3等灯节,表示橋左邊的三個不同地方,B有B1绵估,B2炎疆,B3等,表示橋右邊的三個不同地方国裳,假設(shè)我們要從橋左側(cè)A出發(fā)到橋的右側(cè)B形入,我們可以有多重方案,A1到B1缝左,A1到B2亿遂,A1到B3,A2到B1...等等
橋接模式UML 圖
代碼
#import <Foundation/Foundation.h>
@protocol Qiao <NSObject>
-(void)targetB;
@end
#import <Foundation/Foundation.h>
#import "Qiao.h"
@interface AreaB1 : NSObject<Qiao>
@end
#import "AreaB1.h"
@implementation AreaB1
-(void)targetB{
NSLog(@"到達B1");
}
@end
#import <Foundation/Foundation.h>
#import "Qiao.h"
@interface AreaB2 : NSObject<Qiao>
@end
#import "AreaB2.h"
@implementation AreaB2
-(void)targetB{
NSLog(@"到達B2");
}
@end
#import <Foundation/Foundation.h>
#import "Qiao.h"
@interface AreaA : NSObject
@property (nonatomic,strong) id <Qiao>qiao;
-(void)fromA;
@end
#import "AreaA.h"
@implementation AreaA
@end
#import <Foundation/Foundation.h>
#import "AreaA.h"
@interface AreaA1 : AreaA
@end
#import "AreaA1.h"
@implementation AreaA1
-(void)fromA{
NSLog(@"來自A1");
}
@end
#import "AreaA1.h"
@implementation AreaA1
-(void)fromA{
NSLog(@"來自A1");
}
@end
#import "AreaA2.h"
@implementation AreaA2
-(void)fromA{
NSLog(@"來自A2");
}
@end
測試代碼
AreaA * A1 = [AreaA1 new];
AreaA * A2 = [AreaA2 new];
id<Qiao> B1 = [AreaB1 new];
id<Qiao> B2 = [AreaB2 new];
A1.qiao = B1;
[A1 fromA];
[A1.qiao targetB];
A1.qiao = B2;
[A1 fromA];
[A1.qiao targetB];
A2.qiao = B1;
[A2 fromA];
[A2.qiao targetB];
A2.qiao = B2;
[A2 fromA];
[A2.qiao targetB];
測試結(jié)果
2018-04-08 16:08:23.845952+0800 結(jié)構(gòu)型設(shè)計模式-橋接模式[27184:7186863] 來自A1
2018-04-08 16:08:23.846159+0800 結(jié)構(gòu)型設(shè)計模式-橋接模式[27184:7186863] 到達B1
2018-04-08 16:08:23.846274+0800 結(jié)構(gòu)型設(shè)計模式-橋接模式[27184:7186863] 來自A1
2018-04-08 16:08:23.846371+0800 結(jié)構(gòu)型設(shè)計模式-橋接模式[27184:7186863] 到達B2
2018-04-08 16:08:23.846458+0800 結(jié)構(gòu)型設(shè)計模式-橋接模式[27184:7186863] 來自A2
2018-04-08 16:08:23.846662+0800 結(jié)構(gòu)型設(shè)計模式-橋接模式[27184:7186863] 到達B1
2018-04-08 16:08:23.846759+0800 結(jié)構(gòu)型設(shè)計模式-橋接模式[27184:7186863] 來自A2
2018-04-08 16:08:23.846869+0800 結(jié)構(gòu)型設(shè)計模式-橋接模式[27184:7186863] 到達B2
橋接模式和適配器模式的區(qū)別
適配器模式
橋接模式
從上面的兩個UML 圖就可以看出來渺杉,橋接模式強調(diào)的是一座橋(只有一條路)蛇数。而適配器模式可以算發(fā)出無數(shù)條線路。
由于ios 協(xié)議中是不能包含變量的是越,因此我們只能定義一個基本類耳舅,代替協(xié)議。
下一篇博客
組合模式