三分钟了解类簇

作者: itzhaolei | 来源:发表于2017-05-06 10:28 被阅读86次

    简介:

    什么是类簇?有什么作用?
    类簇是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
    
    • 界面操作
      • 分别依次点击了韩国人、中国人、日本人、机器人
      • 控制面板输出
    控制面板输出
    写在最后:

    可以看出,我们的工厂类对外、提供的方法简单暴力,在内、将事件处理的井井有条,且灵活性高,增删改查都有明确的位置,增加了代码的可读性、可拓展性……等等

    另附:

    githubDemo地址

    相关文章

      网友评论

        本文标题:三分钟了解类簇

        本文链接:https://www.haomeiwen.com/subject/xxsetxtx.html