桥接模式-Bridge Pattern【学习难度:★★★☆☆,使用频率:★★★☆☆】
处理多维度变化——桥接模式(一):跨平台图像浏览系统
处理多维度变化——桥接模式(二):桥接模式概述
处理多维度变化——桥接模式(三):跨平台图像浏览系统的桥接模式解决方案
处理多维度变化——桥接模式(四):适配器模式与桥接模式的联用,桥接模式总结
桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。
这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。
我们通过下面的实例来演示桥接模式(Bridge Pattern)的用法。其中,可以使用相同的抽象类方法但是不同的桥接实现类,来画出不同颜色的圆。
介绍
-
意图:将抽象部分与实现部分分离,使它们都可以独立的变化。
-
主要解决:在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。
-
何时使用:实现系统可能有多个角度分类,每一种角度都可能变化。
-
如何解决:把这种多角度分类分离出来,让它们独立变化,减少它们之间耦合。
-
关键代码:抽象类依赖实现类。
-
应用实例:
1、猪八戒从天蓬元帅转世投胎到猪,转世投胎的机制将尘世划分为两个等级,即:灵魂和肉体,前者相当于抽象化,后者相当于实现化。生灵通过功能的委派,调用肉体对象的功能,使得生灵可以动态地选择。
2、墙上的开关,可以看到的开关是抽象的,不用管里面具体怎么实现的。 -
优点:
1、抽象和实现的分离。
2、优秀的扩展能力。
3、实现细节对客户透明。 -
缺点:
桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。 -
使用场景:
1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
注意事项:对于两个独立变化的维度,使用桥接模式再适合不过了。
桥接模式的特点:
1. 将依赖具体的实现,改为依赖抽象. 得到松耦合的状态
2. 分离了接口和实现部分
3. 提高了扩展性.
Demo地址
一图胜千言.png01、抽象类空调,用于接收指令,具体的指令操作由子类(格力空调,海尔空调)去完成、
#import <Foundation/Foundation.h>
@interface AirConditioner : NSObject
// 空调接收命令
- (void)loadCommand:(NSString *)command;
@end
02、遥控器抽象类 持有空调属性
,可以执行某些操作命令,具体的某些命令(调风向,调冷热)由子类去完成
#import <Foundation/Foundation.h>
#import "AirConditioner.h"
@interface Remote : NSObject
@property (nonatomic,strong) AirConditioner *airConditioner;
// 遥控器给空调发送指令
- (void)setCommand:(NSString *)command;
@end
#import "Remote.h"
@implementation Remote
- (void)setCommand:(NSString *)command {
[self.airConditioner loadCommand:command];
}
@end
子类调风向实现: (调温度的类似)
#import "DirectionRemote.h"
@implementation DirectionRemote
- (void)up {
[super setCommand:@"up"];
}
- (void)down {
[super setCommand:@"down"];
}
- (void)left {
[super setCommand:@"left"];
}
- (void)right {
[super setCommand:@"right"];
}
@end
示例:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
//海尔空调
HaierAirConditioner *haierAirConditioner = [[HaierAirConditioner alloc] init];
//控制风向
DirectionRemote *directionRemote = [[DirectionRemote alloc] init];
//让海尔空调往上吹风
directionRemote.airConditioner = haierAirConditioner;
[directionRemote up];
//控制温度
TemperatureRemote *temperatureRemote = [[TemperatureRemote alloc] init];
//让海尔空调更冷
temperatureRemote.airConditioner = haierAirConditioner;
[temperatureRemote colder];
//让格力空调往下吹热风
GeliAirConditioner *geliAirConditioner = [[GeliAirConditioner alloc] init];
directionRemote.airConditioner = geliAirConditioner;
[directionRemote down];
temperatureRemote.airConditioner = geliAirConditioner;
[temperatureRemote warmer];
}
@end
image.png
网友评论