分类,协力,代理设计模式

分类

分类的基本概念:

分类时OC中新的语法。分类可以在不创建子类的情况下给已存在的类添加方法。在很多情况下分类是比创建子类更优的选择,分类添加的方法会自动被子类继承。分类可以添加新的方法却不能添加新的变量。

分类一般在多人开发同一个类时被使用,分类可以将同一个类可以根据用途放在不同源文件中,从而使得每个人独立开发相应的方法集合。

分类也会在给相关的方法分组时使用。

分类的用法:

1.给一个类添加新的方法

定义一个class类

#import <Foundation/Foundation.h>
@interface class : NSObject
- (void)method1;
@end

#import "class.h"
@implementation class
- (void)method1{
    NSLog(@"method1");
}
@end



创建一个分类,添加一个新的方法

#import "class.h"
@implementation class
- (void)method1{
    NSLog(@"method1");
}
@end


#import "class+category.h"
@implementation class (category)
- (void)method2{
    NSLog(@"method2");
}
@end


测试结果

#import <Foundation/Foundation.h>
#import "class+category.h"
#import "class.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        class *class1 = [[class alloc]init];
        //原有方法
        [class1 method1];
        //新添加的方法
        [class1 method2];
            }
    return 0;
}


结果输出:method1 method2



2给类的方法分类(也叫延展)

例如根据功能给方法分类

#import <Foundation/Foundation.h>

@interface class2 : NSObject
- (void)method1;
@end

@interface class2 (m1)
- (void)method2;
@end

@interface class2 (m2)
- (void)method3;
@end


方法实现

#import "class2.h"

@implementation class2

- (void)method1{
    NSLog(@"method1");
}

//第一类分组实现
- (void)method2{
    NSLog(@"method2");
}

//第二类分组实现
- (void)method3{
    NSLog(@"method3");
}

@end



协议

协议只有方法的声明,遵行协议的类可以根据自己的需求来实现方法。这样接口的声明和定义分开做,程序的耦合性更低。协议的关键字是@protocol

协议的用法

定义一个协议,并定义一个类来实现协议。我们定义一个usb协议。协议中有两个方法,分别用于读和写。

#import <Foundation/Foundation.h>

@protocol usb <NSObject>
- (void)read;
- (void)write;
@end


定义一个移动设备mobile类遵行该协议,并实现协议方法。

#import <Foundation/Foundation.h>
#import "usb.h"
@interface mobile : NSObject<usb>

@end


#import "mobile.h"

@implementation mobile
- (void)read{
    NSLog(@"读取数据");
}

- (void)write{
    NSLog(@"写入数据");
}
@end



代理

代理是一种设计模式,代理可以通过协议来实现对象之间的通信。

例如:在一个电脑的厂家一般都有自己的代理商。我们创建一个电脑的厂家类(以IBM为例),并声明他的代理方法。

#import <Foundation/Foundation.h>

@protocol ibmDelegate <NSObject>
- (void)sale;
@end

@interface ibm : NSObject
//一般把代理的属性设置为weak防止循环引用
@property (nonatomic,weak) id<ibmDelegate> delegate;
- (void)produce;
@end

#import "ibm.h"

@implementation ibm
- (void)produce{
    NSLog(@"生产电脑");
}
@end


定义coo是ibm的代理,遵行代理,实现ibm的代理方法
#import <Foundation/Foundation.h>
#import "ibm.h"
@interface coo : NSObject<ibmDelegate>

@end

#import "coo.h"
@implementation coo
- (void)sale{
    NSLog(@"销售电脑");
}
@end


测试


#import <Foundation/Foundation.h>
#import "coo.h"
#import "ibm.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        coo *c1 = [[coo alloc]init];
        ibm *i1 = [[ibm alloc]init];
        [i1 produce];
//设置代理
        i1.delegate = c1;
        [c1 sale];
            }
    return 0;
}


上述代理模式设计实现了IBM生产和销售代理部分的代码分开,降低了程序之间的耦合性。


注:本文参考了《ios应用开发详解》 郭宏志 编注 电子工业出版社


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值