第 9 条:以“类族模式”隐藏实现细节

“类族(class cluster)”是一种很有用的模式,可以隐藏“抽象基类(abstract base class)”背后的实现细节。

  • Cocoa 中的类族

Objective-C 系统框架中普遍使用此模式,比如 UIKit 中的 UIButton 类。大部分的collection类都是类族,例如 NSArray 及其可变版本 NSMutableArray

创建button时调用类方法:

+ (instancetype)buttonWithType:(UIButtonType)buttonType;

该方法返回的对象类型取决于传入的按钮类型(button type)。而不管返回什么类型的对象,都继承自同一个基类 UIButton
这样做的意义:类的使用者无需关心创建出来的按钮属于哪个子类,也无需关心如何创建等细节(类似设计模式中的工厂模式)。

  • 代码演示

假设有一个处理雇员的类,每个雇员(employee)有“名字(name)”和“薪水(salary)”两个属性,雇员有两种:开发者(developer)和设计者(designer)。

抽象基类示例代码:

//.h文件

typedef NS_ENUM(NSUInteger, EOCEmployType) {
   EOCEmployeeTypeDeveloper,
   EOCEmployeeTypeDesigner
};
​
@interface EOCEmployee : NSObject
​
@property (nonatomic, copy) NSString *name;
@property NSUInteger salary;
​
+ (EOCEmployee *)employeeWithType:(EOCEmployType)type;
//其他方法...
​
​
//.m文件
+ (EOCEmployee *)employeeWithType:(EOCEmployType)type
{
   switch (type) {
       case EOCEmployeeTypeDeveloper:
           return [EOCEmployeeDeveloper new];
           break;
       case EOCEmployeeTypeDesigner:
           return [EOCEmployeeDesigner new];
           break;
       default:
           break;
   }
}

实体子类的示例代码:

@interface EOCEmployeeDeveloper : EOCEmployee //继承自抽象基类

//相关属性和方法
 
@end
  • 新增子类

向类族中新增实体子类时,有几点需要注意(以 NSArray 为例):

  1. 子类应继承自类族中的抽象基类;
  2. 子类应定义自己的数据存储方式;
    子类必须用一个实例变量来存放数组中的高对象。NSArray 只是包在其他隐藏对象外面的壳,它仅仅定义了所有数组都具备的一些接口。
  3. 子类应重写抽象基类中指明需要重写的方法。
    若添加 NSArray 的子类,需实现 countobjectAtIndex: 等方法。

主要来源:《Effective Objective-C 2.0》

你可能感兴趣的:(第 9 条:以“类族模式”隐藏实现细节)