《Objective-C编程之道-iOS设计模式解析》笔记

简介

设计模式是一种思想、一种思路
其实,哪种语言不重要
但,自己本身就是做iOS的,用自己熟悉的语言,更容易理解


设计模式是为特定场景下的问题而定制的解决方案

针对接口编程,而不是针对实现编程

问:如何理解这句话?

OC中的协议(protocol),是对象之间的一种合约,但本身不能实例化为对象。
在OC中,针对什么样的接口呢?

  • 一个是协议(@protocol),协议不定义任何实现,而只声明方法(method)。协议是只定义了抽象行为的“接口”。实现协议的定义这些方法的实现,以执行真正的操作
  • 另外一种定义高度抽象类型的方法是:定义抽象基类(Abstract Base Class, ABC)。通过抽象基类,可以生成一些其他子类可以共享的默认行为。抽象基类与通常的类相似,只是预留了一些可以或应该由子类重载的行为

3. 原型模式

浅复制:只复制了指针
深复制:对象进行了复制

4. 工厂方法

工厂方法也称为虚构造器。它适用于这种情况:一个类无法预期需要生成哪个类的对象,想让其子类来指定所生成的对象。

5. 抽象工厂

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类

在这里插入图片描述
NSNumber就是使用抽象工厂模式

        NSNumber *number = [[NSNumber alloc] init];
        NSNumber *boolNumber = [NSNumber numberWithBool:YES];
        NSNumber *charNumber = [NSNumber numberWithChar:'A'];
        NSNumber *intNumber = [NSNumber numberWithInt:1];
        NSNumber *floatNumber = [NSNumber numberWithFloat:2.8];
        
        NSLog(@"%@", [[number class] description]);
        NSLog(@"%@", [[boolNumber class] description]);
        NSLog(@"%@", [[charNumber class] description]);
        NSLog(@"%@", [[intNumber class] description]);
        NSLog(@"%@", [[floatNumber class] description]);

打印结果“

2021-09-15 16:53:54.182662+0800 OC练习[8005:422695] (null)
2021-09-15 16:53:54.182950+0800 OC练习[8005:422695] __NSCFBoolean
2021-09-15 16:53:54.183029+0800 OC练习[8005:422695] __NSCFNumber
2021-09-15 16:53:54.183072+0800 OC练习[8005:422695] __NSCFNumber
2021-09-15 16:53:54.183103+0800 OC练习[8005:422695] __NSCFNumber

每个返回的对象属于代表最初输入值得不同私有子类。
boolNumber的实际类型其实是__NSCFBoolean
其余的实际类型是:__NSCFNumber

接受不同类型的参数并返回NSNumber实例的类方法,其实就是类工厂方法
NSNumber的类工厂方法生产各种”数工厂“。
numberWithBool:创建__NSCFBoolean工厂的实例
numberWithInt:创建__NSCFNumber工厂的实例

NSNumber是抽象工厂实现的一个例子。基础框架中抽象工厂的这种特点,被称为”类簇“

类簇(Class Cluster)

类簇是基于抽象工厂模式的思想,一种常见的设计模式。它将若干相关的私有具体工厂子类集合到一个公有的抽象超类之下。
NSNumber里面已经有各种数的数据类型(如:字符、整型、浮点型)
客户端使用的时候,无需知道NSNumber实例的具体类型
类簇是抽象工厂的一种形式。比如NSNumber本身是一个高度抽象的工厂,而__NSCFBoolean和__NSCFNumber是具体工厂子类。子类是具体工厂。子类重载了NSNumber中声明的公有工厂方法以生产产品。
例如:intValue和boolValue根据实际NSNumber对象的内部值返回一个值,虽然值的数据类型可能不同。

其他市县为类簇的基础类有:NSData、NSArray、NSDictionary和NSString

NSNumber是个抽象工厂,而NSCFBoolean和NSCFNumber是工厂(具体的)

6. 生成器模式

将一个复杂对象的构建与它的表现分离,使得同样的构建过程可以创建不同的表现

没看懂

7. 单例

保证一个类仅有一个实例,并提供一个访问它的全局访问点

问:何时使用单例模式?
  • 类只能有一个实例,而且必须从一个为人熟知的访问点对其进行访问,比如工厂方法
  • 这个唯一的实例只能通过子类化进行扩展,而且扩展的对象不会破坏客户端代码

虽然静态的全局对象引用类方法,也可以提供全局访问点,但是全局对象无法防止类被实例化一次以上,而且类方法也缺少消除耦合的灵活性。


8. 适配器模式

国内的插座一般是两孔或者三孔,去了国外,由于国外插座的样式跟国内的不一样,可能你的充电器没法用了
在这里插入图片描述
那,我们可以使用一个转换器,或者说适配器,来完成你的充电需求

适配器(包装器)模式就是,用于连接两种不同种类的对象,使其毫无问题地协同工作。

实现适配器的方式大致有两种:类适配器或者对象适配器

OC中,类可以实现协议,同时又继承超类,从而达到C++的多重继承的效果

OC中的Delegate是委托模式,属于对象适配器

  • OC中的协议,等同于JAVA中的接口
  • block可以不使用协议就能实现适配器模式

9. 桥接

将抽象部分与它的实现部分分离,使它们都可以独立地变化。

10. 外观

外观模式为子系统中一组不同的接口提供统一的接口。外观定义一个高层接口,让子系统更易于使用。

在以下两种常见的情形下,会考虑使用外观模式:

  1. 子系统正逐渐变得复杂。应用模式的过程中演化出许多类。可以使用外观为这些子系统类提供一个较简单的接口
  2. 可以使用外观子系统进行分层。每个子系统级别有一个外观作为入口点。让它们通过其外观进行通信,可以简化它们的依赖关系。

11. 中介者

中介者模式:用一个对象来封装一系列对象的交互方式。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

何时会考虑使用中介者?

  • 对象间的监护虽定义明确然而非常复杂,导致一组对象彼此相互依赖而且难以理解;
  • 因为对象引用了许多其他对象并与其通讯,导致对象难以复用;
  • 想要定制一个分布在多个类中的逻辑或行为,又不想生成太多子类。

12. 观察者

观察者模式也叫做 发布-订阅模式,定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

OC中KVO、MVC、notification都使用到了通知

13. 组合

可以把组合想象为一个实体,它包含着同一类型的其他实体。整个结构就像由父节点实体和子节点实体连接而成的树。
UIView就是一个组合结构。
每个UIView的实例可以包含UIView的其他实例,形成统一的树形结构。
让客户端对单个UIView对象和UIView的组合统一对待。

在这里插入图片描述
组合模式的主要目的是:让树形结构中的每个节点具有相同的抽象接口。这样整个结构可作为一个统一的抽象结构使用,而不暴露其内部表示。

14. 迭代器

其实就是一个递归
OC中,NSEnumeration是一个抽象类(协议),遵循这个协议的NSDictionary、NSArray、NSSet遵循这个协议,都具有递归的功能。

15. 访问者

表示一个作用于某对象结构中的各元素的操作。它让我们可以在不改变各元素的类的前提下,定义作用于这些元素的新操作。

在以下场景,可以使用访问者模式:

  • 一个复杂的对象结构包含很多其他对象,它们有不同的接口(比如组合体),但是想对这些对象实施一些依赖于其具体类型的操作。
  • 需要对一个组合结构中的对象进行很多不相关的操作,但是不想让这些操作“污染”这些对象的类。可以将相关的操作集中起来,定义在一个访问者类中,并在需要在访问者中定义的操作时使用它。
  • 定义复杂结构的类很少作修改,但是经常需要向其添加新的操作。

22. 代理

代理模式:为其他对象提供一种代理,以控制对这个对象的访问

一般,好多人把代理模式就认为是委托模式,那么OC中的delegate属于代理模式,也就是委托模式
但在这本书中,将delegate认为属于委托模式;NSProxy为代理模式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值