1.组合和聚合模式
两个对象之间的代码复用关系,代码结构上来讲是低耦合。(继承中的两个对象之间的代码复用关系是高耦合的)
组合:对象的使用是紧耦合的,创建Computer对象会自动的同时创建Cpu对象。(一体机、笔记本)
优:代码的使用是非常简单的。
缺:灵活度不高。
系统的功能。。。
控制器(UIViewController)与视图(UIView)
聚合:对象的使用是松耦合的,创建Computer对象是不会自动的同时创建Cpu对象,需要手动自己指定Cpu对象,如果Cpu对象满足不了需要是可以替换的。(兼容机)
优:灵活度高。
缺:代码的使用略微复杂。
自定义控件:
TRTableView
TRTableViewCell
2.协议
也可以增强一个类的能力,但是需要修改类的源代码。
协议是对象与对象之间的一种约束。
a.语法规则
@protocol 协议名 <父协议>
@required 属性或方法 必须实现的属性和方法
@optional 属性或方法 可选实现的属性和方法
属性或方法 必须实现的属性和方法
@end
b.协议的使用
(1)遵守协议
@interface 类:父类 <协议名>
(2)实现协议中的方法
(3)使用协议的引用指向遵守协议的对象
id<协议名> obj = 遵守协议的对象;
只用使用协议中要求的属性和方法
c.协议也可以使用在数组、参数、返回值类型中,与多态相似。
多态与协议的区别:
父类引用指向子类对象或本类对象。(类与类之间)
协议引用指向遵守协议的对象。(协议与类之间)
d.协议也有继承关系
协议的继承,也相当于协议的合并。
父协议:method
子协议:method2
@protocol 子协议 <父协议>
类<子协议> -> 同时实例method方法与method2方法
e.一个类也可以遵守多个协议,协议与协议之间使用”,”分隔开。
类<协议1,协议2>
f.协议中的属性 必须要合成@synthesize
3.分类:
即可以有选择的添加能力,又不需要改变类的本质。
使用步骤:
(1)创建分类
主类类名+分类类名.h
@interface 主类类名(分类类名)
添加方法的声明
@end
主类类名+分类类名.m
@implementation 主类类名(分类类名)
添加方法的实现@end
(2)导入头文件 才可以使用分类的能力
#import “主类类名+分类类名.h”
(3)直接向对象发送分类消息
[对象引用 添加方法];
使用分类要注意的事项:
a.在分类中,不可以定义实例变量,自然使用属性也没有意义了。
b.在分类中,不可以声明式属性自动生成的实例变量,但可以访问手动生成的实例变量,在分类当中可以调用主类的属性。
c.分类不但可以给自定义的类添加能力,还可以给系统的类添加能力。
NSString字符串
访问网络的能力 connect…
4.扩展(延展)
给类添加一个私有的能力。
扩展是一种特殊的分类。
扩展通常定义在类的.m文件中,也可以定义在其它文件.h文件中。
通常在扩展里面添加私有的实例变量、方法、属性。
补充:
在扩展中可以声明实例变量,自然也可以声明属性。
扩展只能在类的.m文件中使用。
扩展是用来声明私有的属性和方法。
分类与扩展区分:
共同点:都可以给类添加能力。
不同点:
分类:添加公有能力,在分类中是不可以定义实例变量的,分类是有名字的,分类的文件中:主类类名+分类类名.h
扩展:添加私有能力,在扩展中是可以定义实例变量的,扩展是没有名字的,扩展的文件中:主类类名_扩展的文件名.h