1、简单工厂模式、工厂模式、抽象工厂模式的解析-iOS
2、建造者模式的解析-iOS
3、单例模式的解析-iOS
4、原型模式的解析-iOS
5、代理模式的解析-iOS
6、适配器模式的解析-iOS
7、装饰器模式的解析-iOS
8、外观模式的解析-iOS
9、桥接模式的解析-iOS
10、组合模式的解析-iOS
桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。百度百科
桥梁模式所涉及的角色有:
抽象化(Abstraction)角色:抽象化给出的定义,并保存一个对实现化对象的引用。
修正抽象化(Refined Abstraction)角色:扩展抽象化角色,改变和修正父类对抽象化的定义。
实现化(Implementor)角色:这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。
具体实现化(Concrete Implementor)角色:这个角色给出实现化角色接口的具体实现。百度百科
1、使用那些不需要通过继承导致类的个数急剧增加的系统
2、就是抽象和实现可以自己独立扩展,两者之间互不影响
在平常的生活中,我们都使用空调,可能大家都注意到了,如果你的空调遥控器坏了,我们都是在市场上配一个万能的遥控器。你要你用空调的编码序号绑定上空调就可以使用了。
这就涉及到一个问题:每个空调都需要对应一个自己型号的遥控吗。
其实我们的空调开发商,都会生产很多型号的空调,这样是不是每个空调种类都生产一个自己独有的遥控器呢,如果这样做那开发商需要生产很多种类的遥控器。但是我们空调好多的功能都是差不多的,我们其实可以把我们的遥控器设计成一个可以复用和扩展的遥控器。这样我们就可以使用我们的桥接模式来设计。代码如下:
AbstractControl-是遥控器的抽象层
//.h文件
#import
#import "AirConditionerProtocol.h"
@interface AbstractControl : NSObject
@property(nonatomic,weak)id 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
@protocol AirConditionerProtocol <NSObject>
/*
*电源开关
*/
-(void)powerSwitch;
/*
*风速开关
*/
-(void)windSpeedSwitch;
/*
*模式开关
*/
-(void)patternSwitch;
@end
AbstractAirConditioner–抽象的空调层
//.h文件
#import
#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个接口,我们只是在中间做了一个转换。让他们配合着一起工作。
如果有写的不正确或者侵权的,希望大家给我提出来,我会及时修改。谢谢大家。