zoukankan      html  css  js  c++  java
  • 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;
    }

     

  • 相关阅读:
    javascript UniqueID属性
    java中接口的定义与实现
    HPUX平台经常使用命令列举
    Vim简明教程【CoolShell】
    ztree使用系列三(ztree与springmvc+spring+mybatis整合实现增删改查)
    void及void指针含义的深刻解析
    IE无法打开internet网站已终止操作的解决的方法
    Ubuntu下安装eclipse
    codeforces 444 C. DZY Loves Colors(线段树)
    Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的关系
  • 原文地址:https://www.cnblogs.com/mo-shou/p/3500476.html
Copyright © 2011-2022 走看看