遥控器和电视机
- 每个遥控器对应一个电视机,遥控器是控制类,电视机是执行类
- 通用的功能抽象出来成为一个模块,增加复用性, 例如每个遥控器都会有音量键,频道键
桥接模式
- 把抽象层次结构从具体的实现中分离出来,使其能够独立变更。
- 抽象层次定义了供客户端使用的上层抽象接口。实现层结构定义了供抽象层使用的底层接口。
- 实现类的引用被封装到抽象层的实例中,桥接就形成了。
抽象类
AbstractSystem
//拥有执行者的引用,让执行者去执行
@property (nonatomic, strong) AbstractImplementor *implementor;
- (void)command_up {
[self.implementor loadCommand:kUp];
}
- (void)command_down {
[self.implementor loadCommand:kDown];
}
- (void)loadSystem {
}
AbstractImplementor
//执行类要包含所有情形,例如KO, KX只是某个子类才有的特性,但也要包含在这里
typedef enum : NSUInteger {
kUp,
kDown,
kLeft,
kRight,
kA,
kB,
KO,
KX,
} EcommandType;
- (void)loadCommand:(EcommandType)command {
}
实现层1
GBASystem
@interface GBASystem : AbstractSystem
- (void)loadSystem {
NSLog(@"GBASystem");
}
GBAImplementor
@interface GBAImplementor : AbstractImplementor
- (void)loadCommand:(EcommandType)command {
switch (command) {
case kUp:
NSLog(@"GBA up");
break;
case kDown:
NSLog(@"GBA down");
break;
......
}
实现层2
PSPSystem
@interface PSPSystem : AbstractSystem
- (void)loadSystem {
NSLog(@"PSPSystem");
}
- (void)command_X {
[self.implementor loadCommand:KX];
}
- (void)command_O {
[self.implementor loadCommand:KO];
}
PSPImplementor
@interface PSPImplementor : AbstractImplementor
- (void)loadCommand:(EcommandType)command {
switch (command) {
....
case KO:
NSLog(@"PSP O");
break;
case KX:
NSLog(@"PSP X");
break;
}
使用
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// GBA系统 + GBA执行器
AbstractSystem *gbaSystem = [[GBASystem alloc] init];
gbaSystem.implementor = [[GBAImplementor alloc] init];
[gbaSystem loadSystem];
[gbaSystem command_up];
// PSP系统 + PSP执行器
PSPSystem *pspSystem = [[PSPSystem alloc] init];
pspSystem.implementor = [[PSPImplementor alloc] init];
[pspSystem loadSystem];
[pspSystem command_X];
}