• 简单的协议应用-代理模式


    协议(protocol):

    <> 遵守某个协议,只要遵守了这个协议,相当于拥有协议里面的所有方法声明

    • 声明一系列方法
    • 编译器不强求实现协议里所有的方法
    • 分类和协议都只能声明方法,不能声明成员变量
    • NSObject是基协议

    假设一个人要买票,但是他没有空,需要一个代理去帮他问问票价多少啊,还有几张票啊~

    协议TicketDelegate.h,这里指代理所需要拥有的方法。

    //
    //  TicketDelegate.h
    //  协议的应用-代理模式
    //
    //  Created by Mekor on 14-8-30.
    //  Copyright (c) 2014年 Mekor. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    //声明一些跑腿方法
    @protocol TicketDelegate <NSObject>
    
    //返回票价
    -(double)ticketPrice;
    //还剩多少张票
    -(int)leftTicketsNumber;
    @end

    人类:

    //
    //  main.m
    //  协议的应用-代理模式
    //
    //  Created by Mekor on 14-8-30.
    //  Copyright (c) 2014年 Mekor. All rights reserved.
    //
    #import <Foundation/Foundation.h>
    #import "TicketDelegate.h"
    
    @interface Person : NSObject
    
    - (void) buyTicket;
    
    // 拥有一个代理属性
    // id代表代理的类名随便
    // 但必须遵守TicketDelegate协议
    @property (nonatomic, retain) id<TicketDelegate> delegate;
    
    @end
    //
    //  Person.m
    //  协议的应用-代理模式
    //
    //  Created by Mekor on 14-8-30.
    //  Copyright (c) 2014年 Mekor. All rights reserved.
    //
    
    #import "Person.h"
    
    @implementation Person
    
    //买电影票
    -(void)buyTicket
    {
        //叫代理帮自己去买票
        double price=[_delegate ticketPrice];
        int number=[_delegate leftTicketsNumber];
        NSLog(@"通过代理的帮助,票价=%f,还剩%d张票",price,number);
    }
    @end

    代理:

    //
    //  Agent.h
    //  协议的应用-代理模式
    //
    //  Created by Mekor on 14-8-30.
    //  Copyright (c) 2014年 Mekor. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    #import "TicketDelegate.h"
    @interface Agent : NSObject<TicketDelegate>
    
    @end
    //
    //  Agent.m
    //  协议的应用-代理模式
    //
    //  Created by Mekor on 14-8-30.
    //  Copyright (c) 2014年 Mekor. All rights reserved.
    //
    
    #import "Agent.h"
    
    @implementation Agent
    //剩余的票数
    -(int)leftTicketsNumber
    {
        return 1;
    }
    //每一张票多少钱
    -(double)ticketPrice
    {
        return 1000;
    }
    @end

    main.m文件

     1 //
     2 //  main.m
     3 //  协议的应用-代理模式
     4 //
     5 //  Created by Mekor on 14-8-30.
     6 //  Copyright (c) 2014年 Mekor. All rights reserved.
     7 //
     8 
     9 #import <Foundation/Foundation.h>
    10 #import "Person.h"
    11 #import "Agent.h"
    12 int main(int argc, const char * argv[])
    13 {
    14 
    15     @autoreleasepool {
    16         Person *p = [[Person alloc] init];
    17         Agent *a=[[Agent alloc]init];
    18         p.delegate=a;
    19         [p buyTicket];
    20     }
    21     return 0;
    22 }
  • 相关阅读:
    GridView&ObjectDataSource新特性小记 懒人篇(一) 分页上路
    HyperLink多个属性的数据绑定
    关于客户端改变ListBox的一个小问题
    xmlhttp对象调用webservice要点补疑
    GridView&ObjectDataSource 新特性小记 懒人篇(二) 分页加速
    让VisualStudio的StartPage关联自己的博客
    JavaScript null 和 undefined 的比较 Better
    JavaScript 构造函数 Better
    mysql 常用命令汇总 Better
    Vue2前端项目构建&码云托管 Better
  • 原文地址:https://www.cnblogs.com/mekor/p/3947160.html
Copyright © 2020-2023  润新知