一、桥接模式
1、定义:
将抽象部分与它的实现部分分离,使它们都可以独立地变化。
2、原理:
抽象层与实现层相分离,抽象层定义了供客户段调用的抽象接口,实现层提供了具体的逻辑,实现类的应用被封装到抽象层的实例中。
3、UML图如下:
模式使用场景:1,如果一个系统需要在构建的抽象化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系,通过桥接模式可以使它们在抽象层建立一个关联关系0.2,对于哪些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用0.3,一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
比如,一个小米遥控器对应一个小米电视机,一个康佳遥控器对应一个康佳电视机,能不能想办法把各个品牌的遥控器统一抽象出来成一个万能的遥控器去对应所有品牌的电视机呢?下面我们具体来写一个demo。
4、demo
一般方式,我们都是一个品牌遥控器对应一个品牌电视的,比如,一个小米遥控器对应一个小米电视机,一个康佳遥控器对应一个康佳电视机,如下:
XiaoMiTV.h
#import <Foundation/Foundation.h>
@interface XiaoMiTV : NSObject
// 电视提供给外界的接口
- (void)loadCommand:(NSString *)command;
@end
XiaoMiTV.m
#import "XiaoMiTV.h"
@implementation XiaoMiTV
- (void)loadCommand:(NSString *)command {
// 点击之后, 实现的业务逻辑
NSLog(@"您按的是:----%@",command);
}
@end
XiaoMiRemote.h
#import <Foundation/Foundation.h>
#import "XiaoMiTV.h"
@interface XiaoMiRemote : NSObject
@property (nonatomic, strong) XiaoMiTV *TV;
// 方向控制
- (void)up;
- (void)down;
- (void)left;
- (void)right;
@end
XiaoMiRemote.m
#import "XiaoMiRemote.h"
@implementation XiaoMiRemote
- (void)up {
[self.TV loadCommand:@"up"];
}
- (void)down {
[self.TV loadCommand:@"down"];
}
- (void)left {
[self.TV loadCommand:@"left"];
}
- (void)right {
[self.TV loadCommand:@"right"];
}
@end
KJTV.h
#import <Foundation/Foundation.h>
@interface KJTV : NSObject
// 电视提供给外界的接口
- (void)loadCommandKJ:(NSString *)command;
@end
KJTV.m
#import "KJTV.h"
@implementation KJTV
- (void)loadCommandKJ:(NSString *)command {
// 点击之后, 实现的业务逻辑
NSLog(@"您按的是KJ:----%@",command);
}
@end
KJRemote.h
#import <Foundation/Foundation.h>
#import "KJTV.h"
@interface KJRemote : NSObject
@property (nonatomic, strong) KJTV *TV;
// 方向控制
- (void)up;
- (void)down;
- (void)left;
- (void)right;
- (void)action1;
- (void)action2;
@end
KJRemote.m
#import "KJRemote.h"
@implementation KJRemote
- (void)up {
[self.TV loadCommandKJ:@"up"];
}
- (void)down {
[self.TV loadCommandKJ:@"down"];
}
- (void)left {
[self.TV loadCommandKJ:@"left"];
}
- (void)right {
[self.TV loadCommandKJ:@"right"];
}
- (void)action1 {
[self.TV loadCommandKJ:@"action1"];
}
- (void)action2 {
[self.TV loadCommandKJ:@"action2"];
};
@end
客户端:
ViewController.m
XiaoMiTV *TV = [[XiaoMiTV alloc] init];
XiaoMiRemote *remote = [[XiaoMiRemote alloc] init];
remote.TV = TV;
[remote up];
KJTV *TV2 = [[KJTV alloc] init];
KJRemote *remote2 = [[KJRemote alloc] init];
remote2.TV = TV2;
[remote2 action1];
[remote2 up];
将抽象层和实现层进行分离,设计成桥接模式
TV.h
#import <Foundation/Foundation.h>
@interface TV : NSObject
// 电视机提供给外界调用的一个方法
- (void)loadCommand:(NSString *)command;
@end
TV.m
#import "TV.h"
@implementation TV
- (void)loadCommand:(NSString *)command {}
@end
TVXiaoMI.h
#import "TV.h"
@interface TVXiaoMI : TV
@end
TVXiaoMI.m
#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
TVKJ.h
#import "TV.h"
@interface TVKJ : TV
@end
TVKJ.m
#import "TVKJ.h"
@im