mirror of
https://github.com/NohamR/knowledge-kit.git
synced 2026-05-25 04:17:17 +00:00
feature: dyld && LD 链接器
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
# 桥接模式
|
||||
|
||||
|
||||
|
||||
## 概念理解
|
||||
|
||||
桥接模式也叫作桥梁模式,英文是 Bridge Design Pattern。这个模式可以说是 23 种设计模式中最难理解的模式之一了。我查阅了比较多的书籍和资料之后发现,对于这个模式有两种不同的理解方式。
|
||||
@@ -84,5 +86,88 @@ public class DriverManager {
|
||||
实际上,JDBC 本身就相当于“抽象”。注意,这里所说的“抽象”,指的并非“抽象类”或“接口”,而是跟具体的数据库无关的、被抽象出来的一套“类库”。具体的Driver(比如,com.mysql.jdbc.Driver)就相当于“实现”。注意,这里所说的“实现”,也并非指“接口的实现类”,而是跟具体数据库相关的一套“类库”。JDBC 和 Driver 独立开发,通过对象之间的组合关系,组装在一起。JDBC 的所有逻辑操作,最终都委托给 Driver 来执行。
|
||||
|
||||
|
||||
|
||||
## 业务解耦
|
||||
|
||||
假设有这样一个场景:业务有个 TableView 列表,版本迭代的时候,后端的接口不变变化,有 V1、V2、V3,这3个版本需要共存,该怎么设计?
|
||||
|
||||
假设列表相关逻辑是 `BaseObjectA`,后端接口相关是 `BaseObjectB`
|
||||
|
||||
`BaseObject1` 是因为需要处理接口 V1、V2、V3 而产生的基类,具体子类 ObjectA1 等处理具体逻辑;
|
||||
|
||||
```objective-c
|
||||
// BaseObjectA
|
||||
@interface BaseObjectA : NSObject
|
||||
// 桥接模式的核心实现
|
||||
@property (nonatomic, strong) BaseObjectB *objB;
|
||||
// 获取数据
|
||||
- (void)handle;
|
||||
@end
|
||||
|
||||
@implementation BaseObjectA
|
||||
/*
|
||||
A1 --> B1、B2、B3 3种
|
||||
A2 --> B1、B2、B3 3种
|
||||
A3 --> B1、B2、B3 3种
|
||||
*/
|
||||
- (void)handle {
|
||||
// override to subclass
|
||||
[self.objB fetchData];
|
||||
}
|
||||
@end
|
||||
|
||||
// ObjectA1
|
||||
@interface ObjectA1 : BaseObjectA
|
||||
|
||||
@end
|
||||
|
||||
@implementation ObjectA1
|
||||
- (void)handle {
|
||||
// before 业务逻辑操作
|
||||
[super handle];
|
||||
// after 业务逻辑操作
|
||||
}
|
||||
@end
|
||||
```
|
||||
|
||||
`BaseObject2` 是处理数据接口相关的基类,`ObjectB1` 是具体 V1 的实现
|
||||
|
||||
```objective-c
|
||||
// BaseObjectB
|
||||
@interface BaseObjectB : NSObject
|
||||
- (void)fetchData;
|
||||
@end
|
||||
|
||||
@implementation BaseObjectB
|
||||
- (void)fetchData {
|
||||
// override to subclass
|
||||
}
|
||||
@end
|
||||
|
||||
@interface ObjectB1 : BaseObjectB
|
||||
|
||||
@end
|
||||
|
||||
@implementation ObjectB1
|
||||
- (void)fetchData {
|
||||
// 具体的逻辑处理
|
||||
}
|
||||
@end
|
||||
```
|
||||
|
||||
使用
|
||||
|
||||
```objective-c
|
||||
ObjectA1 *objA = [[ObjectA1 alloc] init];
|
||||
BaseObjectB *b1 = [[BaseObjectB alloc] init];
|
||||
objA.objB = b1;
|
||||
[objA handle];
|
||||
```
|
||||
|
||||
桥接模式可以解决这种业务兼容的适配问题。
|
||||
|
||||
|
||||
|
||||
## 总结
|
||||
|
||||
桥接模式有两种理解方式。第一种理解方式是“将抽象和实现解耦,让它们能独立开发”。这种理解方式比较特别,应用场景也不多。另一种理解方式更加简单,类似“组合优于继承”设计原则,这种理解方式更加通用,应用场景比较多。
|
||||
Reference in New Issue
Block a user