桥接模式
桥接模式简介
将抽象部分与它的实现部分分离,使它们都可以独立地变化。
原理:抽象层和实现层分离,抽象层提供了客户端调用的抽象接口,实现层提供了具体的逻辑。实现类的引用被封装到抽象层的实例中,桥接就形成了。
UML图-demo
意图
1、把电视机进行抽象;
2、对电视机抽出不同子类化,去进行各种操作指令的处理;
3、抽象出遥控器类,桥接电视机抽象类,电视机对象进行指令的处理setCommand();
4、对遥控器进行子类化,定义具体的指令方法,子类里的方法去调用父类的setCommand();
我勒个去,逻辑是不是抽离的很干净?万能遥控器,小手指点一点,可以同时去控制小米和康佳,而且不用考虑小米和康佳内部是怎么操作滴。
上代码:
抽象类TV
@interface TV : NSObject
// 电视机提供给外界调用的一个方法
- (void)loadCommand:(NSString *)command;
@end
#import "TV.h"
@implementation TV
- (void)loadCommand:(NSString *)command {}
@end
XIAO米 康佳子类
#import "TV.h"
@interface TVXiaoMI : TV
@end
#import "TVXiaoMI.h"
@implementation TVXiaoMI
- (void)loadCommand:(NSString *)command {
if ([command isEqualToString:@"up"]) {
NSLog(@"您按的是XM:----%@",command);
} else if ([command isEqualToString:@"down"]){
NSLog(@"您按的是XM:----%@",command);
} else if ([command isEqualToString:@"left"]){
NSLog(@"您按的是XM:----%@",command);
} else if ([command isEqualToString:@"right"]){
NSLog(@"您按的是XM:----%@",command);
} else {
NSLog(@"超出范围");
}
}
@end
#import "TV.h"
@interface TVKJ : TV
@end
#import "TVKJ.h"
@implementation TVKJ
- (void)loadCommand:(NSString *)command {
if ([command isEqualToString:@"up"]) {
NSLog(@"您按的是KJ:----%@",command);
} else if ([command isEqualToString:@"down"]){
NSLog(@"您按的是KJ:----%@",command);
} else if ([command isEqualToString:@"left"]){
NSLog(@"您按的是KJ:----%@",command);
} else if ([command isEqualToString:@"right"]){
NSLog(@"您按的是KJ:----%@",command);
} else {
NSLog(@"超出范围");
}
}
@end
抽象遥控器
#import "TV.h"
@interface Remote : NSObject
@property (nonatomic, strong) TV *tv;
- (void)setCommand:(NSString *)commmand;
@end
#import "Remote.h"
@implementation Remote
- (void)setCommand:(NSString *)commmand {
[self.tv loadCommand:commmand];
}
@end
子类化遥控器
#import "Remote.h"
@interface SubRemote : Remote
// 方向控制
- (void)up;
- (void)down;
- (void)left;
- (void)right;
@end
#import "SubRemote.h"
@implementation SubRemote
// 方向控制
- (void)up {
[super setCommand:@"up"];
}
- (void)down {
[super setCommand:@"down"];
}
- (void)left {
[super setCommand:@"left"];
}
- (void)right {
[super setCommand:@"right"];
}
@end
调用
// 遥控器调用康佳电视
SubRemote *subremote = [[SubRemote alloc] init];
subremote.tv = [[TVKJ alloc] init];
[subremote up];
// 遥控器来调用小米
subremote.tv = [[TVXiaoMI alloc] init];
[subremote up];
[subremote down];
打印结果:
2018-01-02 17:46:06.453398+0800 BridgeDemo[5094:457451] 您按的是KJ:----up
2018-01-02 17:46:06.453598+0800 BridgeDemo[5094:457451] 您按的是XM:----up
2018-01-02 17:46:06.453748+0800 BridgeDemo[5094:457451] 您按的是XM:----down