文章目录
  1. 1. 前言
  2. 2. 基础模式
    1. 2.1. MVC - UIViewController
    2. 2.2. 模板方法 - drawRect:
    3. 2.3. 动态创建 -
    4. 2.4. 类别 - category
    5. 2.5. 枚举器 - 快速枚举 enumObjects
    6. 2.6. 访问器 - KVC (key value coding)
    7. 2.7. 复制 - NSCopying/NSMutableCopying
    8. 2.8. 归档和解档 - NSArchiver/NSUnArchiver
    9. 2.9. 执行选择器和延迟执行 - performSelector: withDelay:
    10. 2.10. 匿名类型和异类容器
  3. 3. 通过解耦来变得更强大的模式
    1. 3.1. 单例 - manager
    2. 3.2. 通知 - Notification
    3. 3.3. 代理/委托 - delegate
    4. 3.4. 响应者链 - respone chain
    5. 3.5. 层次结构 - View Hierarchy
    6. 3.6. 联合存储 - reference count / KVC (key value coding)
    7. 3.7. 调用 - NSInvocation
    8. 3.8. 原型 - CellView
    9. 3.9. 装饰器
  4. 4. 主要用于隐藏复杂性的模式
  5. 5. 模式应用的实用工具

前言

设计模式为那些重复出现的编程问题提供了高质量的实用解决方案。它们是一个工具箱,包含了经过多年优化后格式更为简洁的可重用解决方案和最佳做法。核心就是重用

设计模式包含四要素:

  • 模式名称
  • 模式动机或作用
  • 详细描述
  • 成果

设计指导原则

  • 低耦合。减少类、对象间的依赖。
  • 适应变化。提供可更改的机制来实现新需求。
  • 强调的是接口而不是实现。协议。
  • 找到最佳的粒度。某些问题通过一些只涉及几个类的小型模式而得到最佳的解决,而另一些问题则需要通过重用为中心的模式来解决。
  • 使用复合更优于继承。继承导致其与父类造成关系非常密切的耦合,能避免尽量避免。

基础模式

MVC - UIViewController

模板方法 - drawRect:

动态创建 -

类别 - category

枚举器 - 快速枚举 enumObjects

访问器 - KVC (key value coding)

KVC

1
2
3
User* user = [[User alloc] init];
[user setValue:@"haha" forKey:@"name"];
NSLog(@"name = %@", [user valueForKey:@"name"]);

KVC [XXX setValue:属性值 forKey:属性名] 的底层执行机制如下:

  1. 优先考虑调用 『set属性名: 属性值』方法,调用属性的 setter方法;
  2. 如果没有setter方法,KVC会搜索该类的 属性名 成员变量,无论该成员变量在类的接口部分定义还是在实现部分定义,也无论采用哪种访问控制修饰符,如果存在,KVC代码底层就是对该 属性名 成员变量进行赋值;
  3. 如果没有,KVC会搜索该类名称为 属性名 的成员变量, 同样无论其定义位置和修饰符;
  4. 如果仍没有,执行该对象的 setValue: forUndefinedKey:方法,默认该方法引发一个异常,导致程序结束。

valueForKey:与之类似,也为这四个过程,如果都没有,会执行 valueForUndefinedkey:(id) key 方法,默认也会引发一个异常。

还可以用如 [order setValue:@"book" forKeyPath:@"item.name"]; 这种Key路径为 order的item成员变量的成员name赋值。可以组装keyPath,具有很高的灵活性。

复制 - NSCopying/NSMutableCopying

归档和解档 - NSArchiver/NSUnArchiver

执行选择器和延迟执行 - performSelector: withDelay:

匿名类型和异类容器

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

单例 - manager

通知 - Notification

代理/委托 - delegate

响应者链 - respone chain

层次结构 - View Hierarchy

联合存储 - reference count / KVC (key value coding)

KVC

1
2
3
User* user = [[User alloc] init];
[user setValue:@"haha" forKey:@"name"];
NSLog(@"name = %@", [user valueForKey:@"name"]);

调用 - NSInvocation

原型 - CellView

装饰器

主要用于隐藏复杂性的模式

主要用于隐藏复杂性的模式

模式应用的实用工具

模式应用的实用工具

文章目录
  1. 1. 前言
  2. 2. 基础模式
    1. 2.1. MVC - UIViewController
    2. 2.2. 模板方法 - drawRect:
    3. 2.3. 动态创建 -
    4. 2.4. 类别 - category
    5. 2.5. 枚举器 - 快速枚举 enumObjects
    6. 2.6. 访问器 - KVC (key value coding)
    7. 2.7. 复制 - NSCopying/NSMutableCopying
    8. 2.8. 归档和解档 - NSArchiver/NSUnArchiver
    9. 2.9. 执行选择器和延迟执行 - performSelector: withDelay:
    10. 2.10. 匿名类型和异类容器
  3. 3. 通过解耦来变得更强大的模式
    1. 3.1. 单例 - manager
    2. 3.2. 通知 - Notification
    3. 3.3. 代理/委托 - delegate
    4. 3.4. 响应者链 - respone chain
    5. 3.5. 层次结构 - View Hierarchy
    6. 3.6. 联合存储 - reference count / KVC (key value coding)
    7. 3.7. 调用 - NSInvocation
    8. 3.8. 原型 - CellView
    9. 3.9. 装饰器
  4. 4. 主要用于隐藏复杂性的模式
  5. 5. 模式应用的实用工具