第 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》

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容