一,什么是桥接模式
-
定义
抽象出层次结构。
上层抽象接口的职能,实现上层抽象接口的职能,层级间的通信协议(可以抽象为接口)。
桥接模式的目的,就是把抽象层次结构从具体的实现中分离出来,使其能够独立变更。抽象层次定义了供客户端使用的上层抽象接口。实现结构定义了供抽象层使用的底层接口。实现类的引用被封装到控制类抽象层的实例中,桥接就形成了。 -
使用场景
游戏机模拟器、H5混编解决方案
二,桥接模式结构图
实现步骤:
- 创建控制类基类,并定义变量持有具体实现类基类对象关系。
- 创建控制类基类子类,和实现类基类,并在控制器类接口方法中使用基类实现类对象实现功能(基类已经让控制器建立了持有实现类对象的关系)。
- 在控制器内调用控制器子类,建立控制器持有实现类对象。
结构图:
三,代码实现
- 基类
- 控制器基类
- ConsoleController
- ConsoleController.h
#import <Foundation/Foundation.h> #import "ConsoleEmulator.h" @interface ConsoleController : NSObject /** * 抽象模拟器 */ @property (nonatomic, strong) ConsoleEmulator *emulator; /** * 执行指令 * * @param command 指令 */ - (void)excuteCommand:(ConsoleCommand)command; @end
- ConsoleController.m
#import "ConsoleController.h" @implementation ConsoleController - (void)excuteCommand:(ConsoleCommand)command { [_emulator loadInstructionsForCommand:command]; [_emulator excuteInstructions]; } @end
- ConsoleController.h
- ConsoleController
- 实现基类
- ConsoleEmulator
- ConsoleEmulator.h
#import <Foundation/Foundation.h> typedef enum : NSUInteger { kConsoleCommandUp, kConsoleCommandDown, kConsoleCommandLeft, kConsoleCommandRight, kConsoleCommandSelect, kConsoleCommandStart, kConsoleCommandAction1, kConsoleCommandAction2, } ConsoleCommand; @interface ConsoleEmulator : NSObject /** * 加载指令 * * @param command 指令 */ - (void)loadInstructionsForCommand:(ConsoleCommand)command; /** * 执行指令 */ - (void)excuteInstructions; @end
- ConsoleEmulator.m
#import "ConsoleEmulator.h" @implementation ConsoleEmulator - (void)loadInstructionsForCommand:(ConsoleCommand)command { // 由子类重载实现 } - (void)excuteInstructions { // 由子类重载实现 } @end
- ConsoleEmulator.h
- ConsoleEmulator
- 控制器基类
- 子类
- 控制器基类
- GameBoyConsoleController
- GameBoyConsoleController.h
#import "ConsoleController.h" @interface GameBoyConsoleController : ConsoleController - (void)up; - (void)down; - (void)left; - (void)right; - (void)select; - (void)start; - (void)action1; - (void)action2; @end
- GameBoyConsoleController.m
#import "GameBoyConsoleController.h" @implementation GameBoyConsoleController - (void)up { [super excuteCommand:kConsoleCommandUp]; } - (void)down { [super excuteCommand:kConsoleCommandDown]; } - (void)left { [super excuteCommand:kConsoleCommandLeft]; } - (void)right { [super excuteCommand:kConsoleCommandRight]; } - (void)select { [super excuteCommand:kConsoleCommandSelect]; } - (void)start { [super excuteCommand:kConsoleCommandStart]; } - (void)action1 { [super excuteCommand:kConsoleCommandAction1]; } - (void)action2 { [super excuteCommand:kConsoleCommandAction2]; } @end
- GameBoyConsoleController.h
- GameBoyConsoleController
- 实现子类
- GameBoyEmulator
- GameBoyEmulator.h
#import "ConsoleEmulator.h" @interface GameBoyEmulator : ConsoleEmulator - (void)loadInstructionsForCommand:(ConsoleCommand)command; - (void)excuteInstructions; @end
- GameBoyEmulator.m
#import "GameBoyEmulator.h" @implementation GameBoyEmulator - (void)loadInstructionsForCommand:(ConsoleCommand)command { NSLog(@"GameBoyEmulator loadInstructionsForCommand"); } - (void)excuteInstructions { NSLog(@"GameBoyEmulator excute"); } @end
- GameBoyEmulator.h
- GameBoyEmulator
- 控制器基类
- 打印结果:
2019-09-08 00:27:13.226801+0800 BridgePattern[26512:6943326] GameBoyEmulator loadInstructionsForCommand 2019-09-08 00:27:13.226970+0800 BridgePattern[26512:6943326] GameBoyEmulator excute 2019-09-08 00:27:13.227075+0800 BridgePattern[26512:6943326] GameGearEmulator loadInstructionsForCommand 2019-09-08 00:27:13.227162+0800 BridgePattern[26512:6943326] GameGearEmulator excute
四,优缺点
- 优点: 1、抽象和实现的分离。 2、优秀的扩展能力。 3、实现细节对客户透明。
- 缺点:桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
五,demo
桥接模式