简介:
什么是类簇?有什么作用?
类簇是Foundation框架中广泛使用的设计模式。类簇将一些私有的、具体的子类组合在一个公共的、抽象的超类下面,以这种方法来组织类可以简化一个面向对象框架的公开架构,而又不减少功能的丰富性。
实例说明
- 实现效果
-
Demo结构
结构图 -
文件作用简介:
- ViewController 事件区(发起事件的地方)
- ZLManager 工厂类(用来生产对象)
- DifferentActions 这个文件包内装载的是ZLManager的子类(对应着上述效果图的不同功能)
-
事件区代码
\#import "ViewController.h"
\#import "ZLManager.h"
@interface ViewController ()
@end
@implementation ViewController
\- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
\- (IBAction)buttonAction:(UIButton *)sender {
//在外面,只看到了这一句代码,但是在内部,分工明确,且灵活性高。
[[ZLManager managerWithState:sender.tag] action];
}
@end
- 工厂类代码
- ZLManager.h
\#import <Foundation/Foundation.h>
typedef NS_OPTIONS(NSInteger, Selected) {
///中国人
SelectedChinese = 1,
///韩国人
SelectedSouthKoreans ,
///日本人
SelectedJapanese ,
///机器人
SelectedRobot
///待扩充
};
@interface ZLManager : NSObject
///根据一个状态,创建一个对应的对象,并用父类的指针指向这个对象
\+ (instancetype)managerWithState:(Selected)state;
///子类不同动作的相同方法(各自重写此方法实现不同的功能,至于哪个子类的方法会被调用,取决于managerWithState:这个方法返回的对象是谁)
\- (void)action;
@end
- ZLManager.m
#import "ZLManager.h"
#import "ZLChinese.h"
#import "ZLSouthKoreans.h"
#import "ZLJapanese.h"
#import "ZLRobot.h"
@implementation ZLManager
///根据一个状态,创建一个对应的对象,并用父类的指针指向这个对象
\+ (instancetype)managerWithState:(Selected)state{
return [[self allocWithState:state] init];
}
\+ (instancetype)allocWithState:(Selected)state{
if ([self class] == [ZLManager class]) {
if (state==SelectedChinese) {
return [ZLChinese alloc];
}else if (state==SelectedSouthKoreans){
return [ZLSouthKoreans alloc];
}else if (state==SelectedJapanese){
return [ZLJapanese alloc];
}else if (state==SelectedRobot){
return [ZLRobot alloc];
}else{
///待扩充
return nil;
}
}else {
return [super alloc];
}
}
///如果子类有共同事件需要处理,可通过[super action]来处理,此方法会被调用
\- (void)action{
}
@end
- 子类代码(所有子类等同)
#import "ZLChinese.h"
@implementation ZLChinese
///重写父类的动作
\- (void)action{
//调用父类的方法,配置子类的相同事件,如果没有相同事件,则此方法可以省略不写;
[super action];
NSLog(@"中国人");
}
@end
- 界面操作
- 分别依次点击了韩国人、中国人、日本人、机器人
- 控制面板输出
写在最后:
可以看出,我们的工厂类对外、提供的方法简单暴力,在内、将事件处理的井井有条,且灵活性高,增删改查都有明确的位置,增加了代码的可读性、可拓展性……等等
网友评论