美文网首页
桥接模式(Bridge Pattern)

桥接模式(Bridge Pattern)

作者: iOS_学渣 | 来源:发表于2019-11-16 15:33 被阅读0次

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

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

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

    桥接模式

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

    缺点

    整体上来讲增加了复杂度

    相关文章

      网友评论

          本文标题:桥接模式(Bridge Pattern)

          本文链接:https://www.haomeiwen.com/subject/xbjyictx.html