objective-c 协议(Protocol)和代理(Delegate)

协议的基本概念

协议的声明看起来比较类似一个类的接口,不同的是协议没有父类也不能定义实例变量。协议是一种特殊的程序设计结构,用于声明专门被别的类实现的方法,协议在以下场合非常有用:

需要由别的类实现的方法

声明未知类的接口

两个类之间的通信

协议的基本特点

协议可以被任何类实现的方法

协议本身不是类,它使定义了一个其他类可实现的接口

类目也可以采用协议

协议中的关键字

@required:表示必须强制实现的方法

@optional:表示可以有选择性的方法

 

 

代理设计模式的基本概念

通俗来讲,代理就让别人替自己完成一件事情

代理是指一个对象提供机会对另一个对象中的行为发生变化时做出的反应。

代理设计模式的基本思想——两个对象协调解决问题,通常用于对象之间的通信。

代理设计模式的基本特点

简化了对象的行为,最小化了对象之间的耦合度

使用代理,一般来说无需子类化

简化了我们应用程序开发,既容易实现,又灵活

 

 

 

示例代码:

夏目现在想买一台mac,可是她现在有事情,不能去经销商那里购买,所以让经销商帮他找看看还有mac的存货没

FindComputer.h

#import <Foundation/Foundation.h>

@protocol FindComputer <NSObject>

-(void)findcomputer;

@end

Person.h

#import <Foundation/Foundation.h>
#import "FindComputer.h"

@interface Person : NSObject

@property(nonatomic,assign)id<FindComputer>newdelegate;//此处声明一个代理,从而Person可以让代理人完成需要代理的事情
@property(nonatomic,copy)NSString *name;

-(id)initWithName:(NSString *)name withDelegate:(id)delegate;//传入代理
-(void)wantbuyMac;//被代理的事情


@end

Person.m

#import "Person.h"
@implementation Person

-(id)initWithName:(NSString *)name withDelegate:(id)delegate{
    if (self = [super init]) {
        _name = name;
        _newdelegate = delegate;
    }
    return self;
}

-(void)wantbuyMac{
    [_newdelegate findcomputer];
    
}
@end

Dealer.h

#import <Foundation/Foundation.h>
#import "FindComputer.h"
@interface Dealer : NSObject<FindComputer>


@end

Dealer.m

#import "Dealer.h"

@implementation Dealer

-(void)findcomputer{
    NSLog(@"找见了你需要的mac");
}

@end

main.m

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Dealer.h"
int main(int argc, const char * argv[])
{

    @autoreleasepool {
        
        // insert code here...
        NSLog(@"Hello, World!");
        
        Dealer *dealer = [[Dealer alloc]init];
        Person *person = [[Person alloc]initWithName:@"夏目" withDelegate:dealer];
        [person wantbuyMac];

        
    }
    return 0;
}

 

原文地址:https://www.cnblogs.com/mo-shou/p/3500476.html