桥接模式,桥梁模式
意图:将抽象和实现解耦,让它们可以独立变化。
桥接模式基于类的最小设计原则,通过使用封装、聚合以及继承等行为来让不同的类承担不同的责任。它的主要特点是把抽象(abstraction)与行为实现(implementation)分离开来,从而可以保持各部分的独立性以及应对它们的功能扩展。
桥接模式的目的就是把抽象层次结构从具体的实现中分离出来,使其能够独立变更。抽象层次定义了供客户端使用的上层抽象接口。实现层结构定义了供抽象层使用的底层接口。实现类的引用被封装到抽象层的实例中,桥接就形成了。
桥接模式.jpg角色和职责
- Client
桥接模式的使用者 - Abstraction
- 定义抽象类的接口(接口或抽象类)
- 维护一个指向Implementor类型对象的指针
- Refined Abstraction
Abstraction子类 - Implementor
定义实现类的接口,该接口不一定要与Abstraction的接口完全一致;事实上这两个接口可以完全不同。一般来讲,Implementor接口仅提供基本操作,而Abstraction则定义了基于这些基本操作的较高层次的操作。(Abstraction接口定义了基于Implementor接口的更高层次的操作) - ConcreteImplementor
Implementor子类
代码示例
#import <Foundation/Foundation.h>
//抽象发动机类
@interface Engine : NSObject
@end
@implementation Engine
- (void)installEngine {
NSAssert(NO, @"使用子类实现该方法");
}
@end
//具体的发动机A类
@interface EngineA : Engine
@end
@implementation EngineA
- (void)installEngine {
NSLog(@"安装发动机EngineA");
}
@end
//具体的发动机B类
@interface EngineB : Engine
@end
@implementation EngineB
- (void)installEngine {
NSLog(@"安装发动机EngineB");
}
@end
//抽象车类
@interface Car : NSObject
- (instancetype)initWithEngine:(Engine *)engine;
@property (nonatomic, strong) Engine *engine;
@end
@implementation Car
- (instancetype)initWithEngine:(Engine *)engine {
if (self = [super init]) {
self.engine = engine;
}
return self;
}
- (void)installEngine {
NSLog(@"抽象汽车类安装抽象发动机Engine");
}
@end
//具体的宝马车类
@interface BMW : Car
@end
@implementation BMW
- (instancetype)initWithEngine:(Engine *)engine {
if (self = [super init]) {
self.engine = engine;
}
return self;
}
- (void)installEngine {
NSLog(@"依赖");
[self.engine installEngine];
}
@end
//具体的五菱宏光车类
@interface SGMW : Car
@end
@implementation SGMW
- (instancetype)initWithEngine:(Engine *)engine {
if (self = [super init]) {
self.engine = engine;
}
return self;
}
- (void)installEngine {
NSLog(@"依赖");
[self.engine installEngine];
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
Engine *engine = [[EngineA alloc] init];
Car *car = [[BMW alloc] initWithEngine:engine];
[car installEngine];
//车和发动机之间自由组合
engine = [[EngineB alloc] init];
car = [[SGMW alloc] initWithEngine:engine];
[car installEngine];
}
return 0;
}
/*
依赖
安装发动机EngineA
依赖
安装发动机EngineB
*/
用处举例
- 车安装发动机
不同型号的车,安装不同类型的发动机
车 持有(依赖) 发动机 发动机里面有安装 - 图形填充颜色
不同形状的图形,填充不同的颜色 - 遥控器 遥控电视机
不同的遥控器 按键遥控不同的电视机 - 列表 加载不同的网络数据
iOS TableView加载不同的网络数据
...
优点
- 抽象和实现分离
- 优秀的扩展能力
- 实现细节对客户透明
缺点
桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
网友评论