文章目录
  1. 1. 通过解耦来变得更强大的模式
    1. 1.1. 单例 - manager
    2. 1.2. 通知 - Notification
    3. 1.3. 代理/委托 - delegate
    4. 1.4. 观察者模式 - KVO - Key value observing
    5. 1.5. 响应者链 - respone chain
    6. 1.6. 层次结构 - View Hierarchy
    7. 1.7. 联合存储 - reference count
    8. 1.8. 调用 - NSInvocation
    9. 1.9. 原型 - CellView
    10. 1.10. 装饰器

通过解耦来变得更强大的模式

单例 - manager

通知 - Notification

代理/委托 - delegate

观察者模式 - KVO - Key value observing

KVO的使用步骤非常简单:

  1. 为被监听对象(通常是数据模型)注册监听器;
  2. 重写监听器(通常是视图模型)的 observeValueForKeyPath:ofObject:change:context:方法,在数据模型发生变化时,自动被通知,更新视图。

使用举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@interface View: UIView
@property (nonatomic) User* user;
@end
@implement View
- (void)setUser:(User *)user {
_user = user;
[_user addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil]; // 把更改后的值提供给observe方法
}
- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {
NSLog(@"keyPath: %@", keyPath);
NSLog(@"value changed to: %@", [change objectForKey:@"new"]);
}
@end
....
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
View* view = [View alloc] init];
User* user = [[User alloc] init];
[user setValue:@"haha" forKey:@"name"];
NSLog(@"name = %@", [user valueForKey:@"name"]);
[view setUser:user];
user.name = @"newName";
}
...

输出结果:

1
2
3
HuntTest[73464:4776049] name = haha
HuntTest[73464:4776049] keyPath: name
HuntTest[73464:4776049] value changed to: newName

响应者链 - respone chain

层次结构 - View Hierarchy

联合存储 - reference count

调用 - NSInvocation

原型 - CellView

装饰器

文章目录
  1. 1. 通过解耦来变得更强大的模式
    1. 1.1. 单例 - manager
    2. 1.2. 通知 - Notification
    3. 1.3. 代理/委托 - delegate
    4. 1.4. 观察者模式 - KVO - Key value observing
    5. 1.5. 响应者链 - respone chain
    6. 1.6. 层次结构 - View Hierarchy
    7. 1.7. 联合存储 - reference count
    8. 1.8. 调用 - NSInvocation
    9. 1.9. 原型 - CellView
    10. 1.10. 装饰器