桥接模式(Bridge Pattern)

桥接模式:使用桥接模式不只改变你的实现,也改变你的抽象。

桥接模式是将抽象和实现分离,使他们能够各自独立的变化。

下面我们针对它的类图和示例来具体看这个设计模式。

桥接模式

桥接模式将抽象和实现放在两个不同的类层次中,使他们独立的改变。
也就是我们类图中的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.对于具体抽象类的改变不会影响到客户

缺点

整体上来讲增加了复杂度

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容