1.多态性(Polymorphism)
关于多态的普通定义来源于它的希腊词根 – “Poly” 表示很多, “Morph” 表示形式。
在计算机科学中,这个词有特别的定义,依据 Free Online Dictionary of Computing网站的解释:
一个变量,它在可能指向一个对象,这个对象的类在编译时还未知,但是会在运行时根据实际指向的类执行相应的反馈。
这些定义最终可以归结为“一个对象同时可以成为不同的事物”。
Objective-C 中的多态性有一些子类型,但是其中最主要的两种类型,也是最常见的两种就是修饰模式和适配器模式。
修饰(Decorator)模式
苹果公司的基础文档 Cocoa 设计模式中有这样的解释:
修饰设计模式将额外的职责动态的附加给一个对象。修饰模式为用于拓展功能性的子类化提供了灵活的选择。就像子类化一样,修饰模式能让你不用修改原来的代码就能合并添加新的功能。 修饰类包含了一个被拓展行为类的对象。
在Objective-C中,一个修饰模式的最典型例子就是类别的使用。
类别是iOS中一种特别的类,它能让你在不继承一个类,也不需要修改这个类的源代码的情况下为这个类添加额外你所需要的方法。它主要被用来拓展iOS自带的UIKit组件。
类别与子类之间的区别非常的简单:类别能让你为一个存在的类添加新的方法,但是你不能修改已经存在的方法。你不能为一个类别添加新的特性或者实例变量 – 你只能使用那些本来就存在的。如果你想添加新的特性或者实例变量,那你就要考虑使用继承来创建一个子类,并添加你想要添加的特性和方法了。
但是如果你不需要这样做呢?假如你只是需要将你经常使用的一些方法封装进UIKit对象呢?在这种情况下,类别就是你的最佳解决方案。
适配器(Adapter)模式
再看苹果文档中的解释 Cocoa Fundamentals Guide:
适配器设计模式将一个类的接口转变为另外一种用户期望的接口。适配器让那些因为接口不适配而冲突的类能够一起工作。对目标对象的类实现了解耦。
协议是 Objective-C 中适配器的最主要的例子。它可以指定一些能被任何类所实现的方法。它们通常被用于 DataSource 和 Delegate 方法,但是也可以用于帮助两个完全不相关类之间的通信。
这种模式的优势在于只需要某个类声明它遵从这个协议,无论这个类是个模型或者视图又或是控制器都没关系。它只想知道在另外一个类里所发生的事,并为此实现所有需要的方法。
为了知道用户希望车所应转弯的角度,你就需要利用 UIAlertViewDelegate 协议以获取用户输入UIAlertView的数据。
2.类工厂方法
类工厂的主要理念在于产生并返回一个特定类的实例对象,并在产生对象时尽可能的预填充数据。相比调用 alloc/init 再设置特性,使用类工厂的一个显而易见的好处就是,你的代码将会缩短很多。
这样,你就能使用一个方法来创建一个对象并初始化它的所有特性,而不需要用一个方法来创建对象,再用很多行代码来设置各种特性。与此同时,这种技术还有两个不太明显的好处。
其一,它强制了每个使用你的类的人必须提供你所需要的每一项数据,以创建一个功能完整的实例对象。鉴于你在本教程的前面部分所创建的那些对象,你可能也发现了,往往很容易就忘记了一个或两个特性的初始化。有了类工厂方法, 你将被强制关注你创建对象所需要的每一项特性。
其二,公认的减少了使用了 ARC 的代码将产生的问题,在 iOS 5之后类工厂方法将返回自动释放池对象,释放调用者而不必在以后再释放。你可能不需要担心这个问题,除非你需要兼容老的代码,但是这依旧是一个值得注意的问题。