桥接模式:使用桥接模式不只改变你的实现,也改变你的抽象。
桥接模式是将抽象和实现分离,使他们能够各自独立的变化。
下面我们针对它的类图和示例来具体看这个设计模式。
桥接模式桥接模式将抽象和实现放在两个不同的类层次中,使他们独立的改变。
也就是我们类图中的Abstraction(抽象类层次) 和Implementor(实现类层次)。
抽象类层次与实现类层次之间的关系被称为桥接。
说明:这里的抽象类层次和抽象类有很大的不同,这里将真实处理事务的层次称为实现层,将控制和管理的层次称为抽象层次。这里的抽象类层次绝对不是抽象类。
下面让我来举个栗子
我们需要处理一个接口友好的电视遥控器编程。所有遥控器都基于相同的抽象。随着用户数据收集越来越丰富的时候我们需要改变遥控器。这样我们就面对了一个两难的问题,一个是遥控器的变化,一个是电视的变化。
实现类层:电视(协议)
@protocol Televersion <NSObject>
-(void)on;
-(void)off;
-(void)removeAd;
-(void)turnChennel:(int)chennel;
@end
电视具体实现
#import "TV.h"
@implementation TV
-(void)on {
NSLog(@"TV on");
}
-(void)off {
NSLog(@"TV off");
}
- (void)removeAd {
NSLog(@"移除广告...");
}
- (void)turnChennel:(int)chennel {
NSLog(@"开始播放CCTV-%d",chennel);
}
@end
//华为电视(继承TV)实现
@implementation HuaweiTeleversion
- (void)removeAd {
NSLog(@"华为没有广告");
}
@end
//小米电视(继承TV)实现
@implementation MiTeleversion
- (void)removeAd {
NSLog(@"小米移除广告成功");
}
@end
抽象类层:遥控器
#import <Foundation/Foundation.h>
@protocol Televersion ;
NS_ASSUME_NONNULL_BEGIN
@interface RemoteControl : NSObject
@property (nonatomic , strong)id<Televersion> televersion;
-(instancetype)initWithTeleversion:(id<Televersion>)televersion;
-(void)on;
-(void)off;
-(void)removeAd;
-(void)setChennel:(int)chennel;
@end
NS_ASSUME_NONNULL_END
#import "RemoteControl.h"
#import "Televersion.h"
@implementation RemoteControl
-(instancetype)initWithTeleversion:(id<Televersion>)televersion {
if (self = [super init]) {
_televersion = televersion;
}return self;
}
- (void)on {
[_televersion on];
}
-(void)off {
[_televersion off];
}
-(void)removeAd {
[_televersion removeAd];
}
-(void)setChennel:(int)chennel {
[_televersion turnChennel:chennel];
}
@end
具体遥控器的实现
这里HuawiControl继承于RemoteControl
下面的MiControl亦同
#import "HuawiControl.h"
#import "Televersion.h"
@interface HuawiControl ()
@property (nonatomic ,assign)int currentStation;
@end
@implementation HuawiControl
static int MAXSTATION = 200;
-(void)previousChennel {
if (!_currentStation) {
_currentStation = MAXSTATION;
}else {
_currentStation--;
}
[self setChennel:_currentStation];
}
-(void)nextChennel {
if (_currentStation == MAXSTATION) {
_currentStation = 0;
}else {
_currentStation++;
}
[self setChennel:_currentStation];
}
@end
#import "MiControl.h"
#import "Televersion.h"
@implementation MiControl
-(void)home {
[self removeAd];
}
@end
桥接的具体使用
#import <Foundation/Foundation.h>
#import "HuawiControl.h"
#import "MiControl.h"
#import "Televersion.h"
#import "HuaweiTeleversion.h"
#import "MiTeleversion.h"
#import "SonyTeleversion.h"
#import "SunSoungTeleversion.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
HuaweiTeleversion * hw = [[HuaweiTeleversion alloc] init];
HuawiControl * contr = [[HuawiControl alloc] initWithTeleversion:hw];
[contr previousChennel];
MiTeleversion * mi = [[MiTeleversion alloc] init];
MiControl * miContr = [[MiControl alloc] initWithTeleversion:mi];
[miContr home];
}
return 0;
}
这样就实现了抽象(抽象层)和实现(实现层)的分离。
优点
1.将实现解耦,让实现和界面不在永久绑定
2.抽象和实现可以独立扩展不会影响到对方
3.对于具体抽象类的改变不会影响到客户
缺点
整体上来讲增加了复杂度
网友评论