类簇
类簇是一种架构,它将数个私有具体子类聚集到一个公共抽象超类。通过这种方式对类进行分组,我们就可以向用户(只能看到公共可见的架构)提供简化的接口。而在幕后,抽象类则会调用最合适的私有子类执行特定任务。例如,Cocoa中有几个常见的类,包括NSArray
、NSString
以及NSDictionary
在内,以类簇方式实现。由于具有多个私有子类,内部的数据存储就存在多种表现方式。对于任意具体实例,抽象类会根据初始化数据为其选择最有效的类。
类簇和其他类相似,您同样可以为它创建实例并与之交互。但在创建公共类实例的时候,公共类会根据调用的方法返回适当的子类对象。(您无需也无法选择实例的确切类型)
以Foundation 框架中的 NSString
类为例,如下代码将创建三个不同的字符串对象:
每个字符串可能分属不同私有子类(实际上,在Mac OS X v10.5系统中,这三个字串的确分属不同私有子类)。虽然每个对象都属于NString
私有子类,但将其当作NSString
类的实例可以带来很大方便,因为这样一来,这些对象就可以使用NSString
声明的实例方法。
使用类簇优点
使用类簇的主要优点是效率。一方面,我们可以根据实例创建或使用的方式对其管理的内部数据进行裁减;另一方面,我们编写的代码可独立于底层实现,即使底层实现发生变化,我们的代码照样工作。
使用类簇的代价
使用类簇架构需要在简易性和可扩展性之间作出权衡。使用少量的公共类替代多个私有类可以让学习和使用框架类变得更加容易,但是想要在类簇中创建子类就会稍微困难一些。
您在类簇中创建的子类必须符合下述条件:
-
必须是类簇抽象超类的子类。
-
必须声明自己数据存储。
-
必须重载超类的原始方法
如果类簇几乎不需要创建子类—框架的类簇就是如此—则类簇架构就具有明显优势。您也许可以使用组合这种模式来避免子类化。通过将某个私有类簇嵌入到您自己设计的对象,您就可以创建一个组合对象,该对象只负责截取希望进行特殊处理的消息,而基本功能则依赖类簇对象实现。通过这种方式,您可以降低需要编写代码量,并可利用Foundation框架提供的已测试代码。