桥接模式的解析-iOS

桥接模式的解析-iOS

其他设计模式的介绍

1、简单工厂模式、工厂模式、抽象工厂模式的解析-iOS
2、建造者模式的解析-iOS
3、单例模式的解析-iOS
4、原型模式的解析-iOS
5、代理模式的解析-iOS
6、适配器模式的解析-iOS
7、装饰器模式的解析-iOS
8、外观模式的解析-iOS
9、桥接模式的解析-iOS

概率描述

桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。百度百科

角色

桥梁模式所涉及的角色有:
抽象化(Abstraction)角色:抽象化给出的定义,并保存一个对实现化对象的引用。
修正抽象化(Refined Abstraction)角色:扩展抽象化角色,改变和修正父类对抽象化的定义。
实现化(Implementor)角色:这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。
具体实现化(Concrete Implementor)角色:这个角色给出实现化角色接口的具体实现。百度百科

实用场景

1、使用那些不需要通过继承导致类的个数急剧增加的系统
2、就是抽象和实现可以自己独立扩展,两者之间互不影响

案例解析

在平常的生活中,我们都使用空调,可能大家都注意到了,如果你的空调遥控器坏了,我们都是在市场上配一个万能的遥控器。你要你用空调的编码序号绑定上空调就可以使用了。
这就涉及到一个问题:每个空调都需要对应一个自己型号的遥控吗。
其实我们的空调开发商,都会生产很多型号的空调,这样是不是每个空调种类都生产一个自己独有的遥控器呢,如果这样做那开发商需要生产很多种类的遥控器。但是我们空调好多的功能都是差不多的,我们其实可以把我们的遥控器设计成一个可以复用和扩展的遥控器。这样我们就可以使用我们的桥接模式来设计。代码如下:
AbstractControl-是遥控器的抽象层

//.h文件
#import <Foundation/Foundation.h>
#import "AirConditionerProtocol.h"

@interface AbstractControl : NSObject
@property(nonatomic,weak)id <AirConditionerProtocol> airConditionerProtocol;
-(void)fitAirConditioner;
@end

//.m文件
#import "AbstractControl.h"

@implementation AbstractControl
-(void)fitAirConditioner{
    NSLog(@"检查子类空调具备的功能");
}

@end

AbstractControl–遥控器真实调用层继承自AbstractControl

//.h文件
#import "AbstractControl.h"

@interface VeritableControl : AbstractControl

@end

//.m文件
#import "VeritableControl.h"

@implementation VeritableControl
-(void)fitAirConditioner{
    [self.airConditionerProtocol powerSwitch];
    [self.airConditionerProtocol patternSwitch];
    [self.airConditionerProtocol windSpeedSwitch];
}
@end

AirConditionerProtocol—遥控器和空调之间的桥接点

#import <Foundation/Foundation.h>

@protocol AirConditionerProtocol <NSObject>
/*
 *电源开关
 */
-(void)powerSwitch;
/*
 *风速开关
 */

-(void)windSpeedSwitch;
/*
 *模式开关
 */
-(void)patternSwitch;

@end

AbstractAirConditioner–抽象的空调层

//.h文件
#import <Foundation/Foundation.h>
#import "AirConditionerProtocol.h"

@interface AbstractAirConditioner : NSObject<AirConditionerProtocol>

@end

//.m文件
#import "AbstractAirConditioner.h"

@implementation AbstractAirConditioner
/*
 *电源开关
 */
-(void)powerSwitch{
    NSLog(@"电源开关,具体的由子类自己去实现");
}
/*
 *风速开关
 */

-(void)windSpeedSwitch{
    NSLog(@"风速开关,具体的由子类自己去实现");

}
/*
 *模式开关
 */
-(void)patternSwitch{
    NSLog(@"模式开关,具体的由子类自己去实现");

}

@end

VertableAirConditionerA-真实的空调层,继承自AbstractAirConditioner

//.h文件
#import "AbstractAirConditioner.h"

@interface VertableAirConditionerA : AbstractAirConditioner
/*
 *电源开关
 */
-(void)powerSwitch;
/*
 *风速开关
 */

-(void)windSpeedSwitch;
/*
 *模式开关
 */
-(void)patternSwitch;

@end

//.m文件
#import "VertableAirConditionerA.h"

@implementation VertableAirConditionerA
/*
 *电源开关
 */
-(void)powerSwitch{
    NSLog(@"空调A,具备了电源开关");
}
/*
 *风速开关
 */

-(void)windSpeedSwitch{
    NSLog(@"空调A,具备了风速开关");

}
/*
 *模式开关
 */
-(void)patternSwitch{
    NSLog(@"空调A,不具备调节开关");

}

@end

VertableAirConditionerB-真实的空调层,继承自AbstractAirConditioner

//.h文件
#import "AbstractAirConditioner.h"

@interface VertableAirConditionerB : AbstractAirConditioner
/*
 *电源开关
 */
-(void)powerSwitch;
/*
 *风速开关
 */

-(void)windSpeedSwitch;
/*
 *模式开关
 */
-(void)patternSwitch;

@end

//.m文件
#import "VertableAirConditionerB.h"

@implementation VertableAirConditionerB
/*
 *电源开关
 */
-(void)powerSwitch{
    NSLog(@"空调B,具备了电源开关");
}
/*
 *风速开关
 */

-(void)windSpeedSwitch{
    NSLog(@"空调B,具备了风速开关");

}
/*
 *模式开关
 */
-(void)patternSwitch{
    NSLog(@"空调B,具备调节开关");

}

@end

调用代码

    /************** 桥接模式*************************/
    VeritableControl *veritableControl = [[VeritableControl alloc]init];
    VertableAirConditionerA* vertableAirConditionerA = [[VertableAirConditionerA alloc]init];
    veritableControl.airConditionerProtocol = vertableAirConditionerA;
    [veritableControl fitAirConditioner];
    NSLog(@"\n");
    VeritableControl *veritableControlOne = [[VeritableControl alloc]init];
    VertableAirConditionerB* vertableAirConditionerB = [[VertableAirConditionerB alloc]init];
    veritableControlOne.airConditionerProtocol = vertableAirConditionerB;
    [veritableControlOne fitAirConditioner];

命令行的结果

2018-06-26 15:42:31.821888+0800 DesignDemo[2780:151842] 空调A,具备了电源开关
2018-06-26 15:42:31.822277+0800 DesignDemo[2780:151842] 空调A,不具备调节开关
2018-06-26 15:42:31.822875+0800 DesignDemo[2780:151842] 空调A,具备了风速开关
2018-06-26 15:42:31.822997+0800 DesignDemo[2780:151842] 
2018-06-26 15:42:31.823294+0800 DesignDemo[2780:151842] 空调B,具备了电源开关
2018-06-26 15:42:31.823504+0800 DesignDemo[2780:151842] 空调B,具备调节开关
2018-06-26 15:42:31.824036+0800 DesignDemo[2780:151842] 空调B,具备了风速开关

优缺点

优点:
1、实现了抽象和实现的分离
2、拥有更好的扩展性
3、可以动态的切换实现
缺点:
1、增加了系统的设计复杂程度
2、代码的可读性差

桥接模式和适配模式的区别

大家有没有发现这个我之前写过的适配器的解析有点类似,我们来说明比较一下这个2个模式的区别
相同点:
桥接模式和适配器模式都是让两个接口配合的工作
不同点:
桥接模式:把实现和抽象都分离开了,可以让两者的接口可以不一样。主要的目的是把他们分离开了。桥接模式是先有桥在有2端的接口,这个就好像,我们控制空调的一些指令,他就想一个桥一样,把我们一些通过遥控器传递给给空调,让空调工作。
适配器模式:适配器模式是,先有2端的东西以后,为了让2端的东西更好的相容,才有的适配器。就好像我们的国家电网,和我们平常使用的电器设备,他们是已经存在的2个接口,我们只是在中间做了一个转换。让他们配合着一起工作。

总结

如果有写的不正确或者侵权的,希望大家给我提出来,我会及时修改。谢谢大家。

猜你喜欢

转载自blog.csdn.net/u014644610/article/details/80817878