OC 類簇與複合 類簇: 類簇是Foundation框架中廣泛使用的設計模式。類簇將一些私有的、具體的子類組合在一個公共的、抽象的超類下麵,以這種方法來組織類可以簡化一個面向對象框架的公開架構,而又不減少功能的豐富性。 簡單的來說,NSString是個“工廠類”,然後它在外層提供了很多方法介面,但是 ...
OC 類簇與複合
類簇:
類簇是Foundation框架中廣泛使用的設計模式。類簇將一些私有的、具體的子類組合在一個公共的、抽象的超類下麵,以這種方法來組織類可以簡化一個面向對象框架的公開架構,而又不減少功能的豐富性。
簡單的來說,NSString是個“工廠類”,然後它在外層提供了很多方法介面,但是這些方法的實現是由具體 的內部類來實現的。當使用NSString生成一個對象時,初始化方法會判斷哪個“自己內部的類”最適合生成這個對象,然後這個“工廠”就會生成這個具體的類對象返回給你。這種又外層類提供統一抽象的介面,然後具體實現讓隱藏的,具體的內部類來實現,在設計模式中稱為“抽象工廠”模式。
類簇實現的類不適宜繼承。(有關博客點擊下麵的連接)
我在這裡實現了一個簡單的類簇:
//
// CXString.m
// 類簇
//
// Created by ma c on 16/5/11.
// Copyright © 2016年 xubaoaichiyu. All rights reserved.
//
#import "CXString.h"
@interface cx1 : CXString
@end
@implementation cx1
- (void)method{
NSLog(@"%s",__func__);
}
@end
@interface cx2 : CXString
@end
@implementation cx2
- (void)method{
NSLog(@"%s",__func__);
}
@end
@implementation CXString
+ (CXString *)CXString1{
cx1 * cx = [[cx1 alloc]init];
return cx;
}
+ (CXString *)CXString2{
cx2 * cx = [[cx2 alloc]init];
return cx;
}
@end
上面的代碼並不是很難讀懂,就不做過多的解釋.
下麵我調用一下我所設計的'類簇'
//
// ViewController.m
// 類簇
//
// Created by ma c on 16/5/11.
// Copyright © 2016年 xubaoaichiyu. All rights reserved.
//
#import "ViewController.h"
#import "CXString.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
CXString * cx1 = [CXString CXString1];
CXString * cx2 = [CXString CXString2];
[cx1 method];
[cx2 method];
}
@end
輸出結果
2016-05-11 18:01:14.643 類簇[3161:1545420] -[cx1 method]
2016-05-11 18:01:14.644 類簇[3161:1545420] -[cx2 method]
複合:
在OC的複合模式就是把其他對象作為自身的一部分,以提升自身的功能。換句話說複合是某一個複雜的類,需要由多個不同的類組成。
比如我現在要製作一臺電腦,電腦需要CPU,顯示器,滑鼠和鍵盤等。這些東西的研發都是很複雜的過程。如果現在有成型的CPU等組件,就可以直接用這些組件攢一臺電腦。複合模式就是這樣。
所有我們在製作電腦前要先找到這些組件。這些組件並不需要我們來製作,有專業的公司提供這些成型的組件。
這裡我做一個實例:電腦使用鍵盤和滑鼠
//
// ViewController.m
// 複合
//
// Created by ma c on 16/5/11.
// Copyright © 2016年 xubaoaichiyu. All rights reserved.
//
#import "ViewController.h"
#import "Computer.h"
#import "Keyboard.h"
#import "mouse.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
Computer * com = [[Computer alloc]init];
Keyboard * key = [[Keyboard alloc]init];
mouse * mou = [[mouse alloc]init];
com.keyboard = key;
com.mouse = mou;
[com useMouse];
[com useKeyboard];
}
@end
//
// Computer.h
// 複合
//
// Created by ma c on 16/5/11.
// Copyright © 2016年 xubaoaichiyu. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Keyboard.h"
#import "mouse.h"
@interface Computer : NSObject
@property (nonatomic, strong) Keyboard * keyboard;
@property (nonatomic, strong) mouse * mouse;
- (void) useKeyboard;
- (void) useMouse;
@end
//
// Computer.m
// 複合
//
// Created by ma c on 16/5/11.
// Copyright © 2016年 xubaoaichiyu. All rights reserved.
//
#import "Computer.h"
@implementation Computer
- (void)useKeyboard {
[self.keyboard test];
}
- (void)useMouse{
[self.mouse test];
}
@end
//
// Keyboard.m
// 複合
//
// Created by ma c on 16/5/11.
// Copyright © 2016年 xubaoaichiyu. All rights reserved.
//
#import "Keyboard.h"
@implementation Keyboard
- (void) test{
NSLog(@"I am a keyboard");
}
@end
//
// mouse.m
// 複合
//
// Created by ma c on 16/5/11.
// Copyright © 2016年 xubaoaichiyu. All rights reserved.
//
#import "mouse.h"
@implementation mouse
- (void)test{
NSLog(@"I am a mouse");
}
@end
測試結果:
2016-05-11 18:31:28.434 複合[3189:1554979] I am a mouse
2016-05-11 18:31:28.435 複合[3189:1554979] I am a keyboard