OC 类簇与复合


类簇:

类簇是Foundation框架中广泛使用的设计模式。类簇将一些私有的、具体的子类组合在一个公共的、抽象的超类下面,以这种方法来组织类可以简化一个面向对象框架的公开架构,而又不减少功能的丰富性。

简单的来说,NSString是个“工厂类”,然后它在外层提供了很多方法接口,但是这些方法的实现是由具体 的内部类来实现的。当使用NSString生成一个对象时,初始化方法会判断哪个“自己内部的类”最适合生成这个对象,然后这个“工厂”就会生成这个具体的类对象返回给你。这种又外层类提供统一抽象的接口,然后具体实现让隐藏的,具体的内部类来实现,在设计模式中称为“抽象工厂”模式。

类簇实现的类不适宜继承。(有关博客点击下面的连接)

IOS 杂笔-1(为什么不继承类簇?)

我在这里实现了一个简单的类簇:

//
// 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

OC 类簇与复合的更多相关文章

  1. 【IOS学习基础】OC类的相关

    几天前突然在别人的类的.m文件中看到这么一句代码:@synthesize xxxx = _xxxx; 当时愣是没理解啥意思,过后才缓过神来发现原来是把一些类的基础知识忘记了,虽然不用过多去深究以前的一 ...

  2. IOS 杂笔-1(为什么不继承类簇?)

    答:首先,类簇是可以继承的,并不是不可以.例如,我们可以选择继承NSSting,但是此时你用你自己设定的类去调用NSSting的一些方法时,会存在无法实现的问题,这是为什么呢. 1.类簇里有很多私有的 ...

  3. iOS - 类簇

    类簇是在Objective-C中Foundation Framework中广泛使用的一种设计模式 1.发现类簇(Class Cluster)的踪迹 //*> 执行下面代码 id obj1 = [ ...

  4. KMeans聚类 K值以及初始类簇中心点的选取 转

    本文主要基于Anand Rajaraman和Jeffrey David Ullman合著,王斌翻译的<大数据-互联网大规模数据挖掘与分布式处理>一书. KMeans算法是最常用的聚类算法, ...

  5. 第一个OC类、解析第一个OC程序

    01第一个OC 类 本文目录 • 一.语法简介 • 二.用Xcode创建第一个OC的类 • 三.第一个类的代码解析 • 四.添加成员变量 • 五.添加方法 • 六.跟Java的比较 • 七.创建对象 ...

  6. Objective-c 总结(一):OC类的设计

    (一)学习目标: 1.面向对象基本概念: OOP的主要思想是把构成问题的各个事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述一个事物在整个解决问题步骤中的行为. 2.熟悉OC类的定 ...

  7. Objective-C 类簇深入理解

    类簇(class cluster),是一种基于抽象工厂的设计模式,广泛运用于系统的Foundation框架.顾名思义,即一坨类,这里指的是继承自同一父类的一组私有子类.这种实现既可以简化公共接口,又保 ...

  8. iOS开发-类簇(Class Cluster)

    类簇(Class  Cluster)是定义相同的接口并提供相同功能的一组类的集合,仅公开接口的抽象类也可以称之为类簇的公共类,每个具体类的接口有公共类的接口抽象化,并隐藏在簇的内部.这些类一般不能够直 ...

  9. OC学习那些事:第一个OC类

    一.创建一个新的OC类: 1.点击File->New File,打开Choose a template for your new file窗口,选择Objective-C class,点击Nex ...

随机推荐

  1. 通过3个Hello World应用来了解ASP.NET 5应用是如何运行的(1)

    微软在开发ASP.NET 5(当时被称为ASP.NET vNext)是采用的代号为Project K,所以运行时被称为KRuntime.KRuntime是一个SDK,它包含了编译和运行应用程序的所有资 ...

  2. Google Chrome 应用商店上传扩展程序

    1. 进入 Google 开发者中心 网址: https://chrome.google.com/webstore/developer/dashboard?hl=zh-cn 2. 添加新项 上传后,出 ...

  3. ASP.NET WebForms MapPageRoute 路由配置

    MapPageRoute 应该是 ASP.NET 4.0 中的东西,但现在我是第一次使用它,使用场景是:MVC 混合使用 WebForm,然后对 WebForm 进行路由配置,当然也可以使用 ISAP ...

  4. AspNetPager分页控件配置

    AspNetPager是asp.net中常用的分页控件,下载AspNetPager.dll,添加引用,在工具栏就可以看到AspNetPager控件: 拖过来之后,设置如下属性: <webdiye ...

  5. PostgreSql+PostGIS和uDig的安装

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 总体来说,这两款开源软件均是很好安装的,一般按照提示一步一步 ...

  6. js实现无限极分类

    转载注明出处!!! 转载注明出处!!! 转载注明出处!!! 因为要实现部门通讯录,后台传来的数据是直接从数据库里拿的部门表,所以没有层级分类,只有parentId表示从属关系,所以分类的事情就交给我来 ...

  7. 代码的坏味道(2)——过大的类(Large Class)

    坏味道--过大的类(Large Class) 特征 一个类含有过多字段.函数.代码行. 问题原因 类通常一开始很小,但是随着程序的增长而逐渐膨胀. 类似于过长函数,程序员通常觉得在一个现存类中添加新特 ...

  8. Block知识点总结

    block的作用 block用于保存一段代码 在适当的时候再使用  它是一种数据类型 block的定义格式: 返回值  (^block变量名)(形参列表) = ^(形参列表) { 需要执行的代码}; ...

  9. 六、CsrfViewMiddleware

    CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF. 你这可 ...

  10. C# Socket异步聊天例子

    最近在配合游戏服务器端搞一个客户端通信,客户端是unity搞的,理所当然就高C#了,上手之前先看了一下C# Socket通信这一块,基本不考虑同步方式,而异步方式,微软也提供了两套API,一套是Beg ...