桥接模式(Bridge Pattern)

2022-09-13  本文已影响0人  long弟弟

桥接模式,桥梁模式

意图:将抽象和实现解耦,让它们可以独立变化。

桥接模式基于类的最小设计原则,通过使用封装、聚合以及继承等行为来让不同的类承担不同的责任。它的主要特点是把抽象(abstraction)与行为实现(implementation)分离开来,从而可以保持各部分的独立性以及应对它们的功能扩展。

桥接模式的目的就是把抽象层次结构从具体的实现中分离出来,使其能够独立变更。抽象层次定义了供客户端使用的上层抽象接口。实现层结构定义了供抽象层使用的底层接口。实现类的引用被封装到抽象层的实例中,桥接就形成了。

桥接模式.jpg

角色和职责

  1. Client
    桥接模式的使用者
  2. Abstraction
  1. Refined Abstraction
    Abstraction子类
  2. Implementor
    定义实现类的接口,该接口不一定要与Abstraction的接口完全一致;事实上这两个接口可以完全不同。一般来讲,Implementor接口仅提供基本操作,而Abstraction则定义了基于这些基本操作的较高层次的操作。(Abstraction接口定义了基于Implementor接口的更高层次的操作)
  3. 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
 */

用处举例

  1. 车安装发动机
    不同型号的车,安装不同类型的发动机
    车 持有(依赖) 发动机 发动机里面有安装
  2. 图形填充颜色
    不同形状的图形,填充不同的颜色
  3. 遥控器 遥控电视机
    不同的遥控器 按键遥控不同的电视机
  4. 列表 加载不同的网络数据
    iOS TableView加载不同的网络数据
    ...

优点

  1. 抽象和实现分离
  2. 优秀的扩展能力
  3. 实现细节对客户透明

缺点

桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。

上一篇 下一篇

猜你喜欢

热点阅读