zoukankan      html  css  js  c++  java
  • 设计模式:代理

    1.通过中介公司找房子 

    //1:协议声明:
    #import <Foundation/Foundation.h>  
    @protocol FindApartment <NSObject> 
      -(void)findApartment;
    @end
    
    //2:代理角色声明(Agent.h)头文件声明
    #import <Foundation/Foundation.h> 
    #import "FindApartment.h" 
        @interface Agent : NSObject <FindApartment> 
    @end
    
    //3:代理角色实现(Agent.m)实现文件
    #import "Agent.h" 
    @implementation Agent 
    -(void)findApartment{     
        NSLog(@"findApartment"); 
    } 
    @end
    
    //4:真实角色声明(Person.h)头文件声明
    #import <Foundation/Foundation.h>
    #import "FindApartment.h" 
    @interface Person : NSObject {   
      @private     NSString *_name;    
      id<FindApartment> _delegate; //委托人(具备中介找房子的协议) 
    }
    @property(nonatomic,copy) NSString *name;
    @property(nonatomic,assign)id<FindApartment> delegate; 
    -(id)initWithName:(NSString *)name withDelegate:(id<FindApartment>) delegate;
    -(void)wantToFindApartment;
    @end
    
    //5:真实角色实现(Person.m)实现
    #import "Person.h" 
    //定义私有方法 
    @interface Person()
     -(void)startFindApartment:(NSTimer *)timer; 
    @end 
    @implementation Person
     @synthesize name=_name; 
     @synthesize delegate=_delegate;
     -(id)initWithName:(NSString *)name withDelegate:(id<FindApartment>) delegate{     
        self=[super init];     
        if(self){         
            self.name=name;         
            self.delegate=delegate;     
        }    
        return self; 
     } 
     -(void)wantToFindApartment{     
        [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(startFindApartment:) userInfo:@"Hello" repeats:YES];     
     }  
     -(void)startFindApartment:(NSTimer *)timer{    
         //NSString *userInfo=[timer userInfo];     
        [self.delegate findApartment];
     }
    @end
    
    //6:测试代理main.m方法
    #import <Foundation/Foundation.h> 
    #import "Person.h" 
    #import "Agent.h"
    int main(int argc, const char * argv[]) {     
     @autoreleasepool {                  
        // insert code here...         
        NSLog(@"Hello, World!");         
        Agent *agent=[[Agent alloc]init];         
        Person *jack=[[Person alloc]initWithName:@"jack" withDelegate:agent];         
        [jack wantToFindApartment];         
        [[NSRunLoop currentRunLoop]run];         
        [jack autorelease];     
     }     
     return 0; 
    }
    View Code

    2.代理设计模式的编码规范:

    (1)一帮情况下,当协议属于谁,就将协议定义到谁的头文件中
    (2)协议的名称一般以它属于那个类的类名开头,后面跟上protocol或delegate
    (3)协议中的方法名称一般以协议的名称protocol之前的作为开头
    (4)一般情况下,协议中的方法会将触发该协议的对象传递出去
    (5)一般情况下,一个类中的代理的名称叫做 delegate;
    (6)当一个类要成为另外一个类的代理的时候,一般情况下:
             .h中用   @protocol 协议名称;   来告诉当前类,这是一个协议。
             .m中 用   #import 类名  来真正导入协议的声明

     例子:学生找房子

    Student.h
    #import <Foundation/Foundation.h>
    @class Student;
    
    //通过代理来找房子,所以首先定义一个协议
    @protocol StudentProtocol <NSObject>
    
    -(void)studentFindHourse:(Student *)student;
    
    @end
    
    
    @interface Student : NSObject
    
    //代理
    @property(nonatomic, strong) id<StudentProtocol> delegate;
    
    //找房子
    -(void)findHourse;
    
    @end
    
    ----------------------------------------------------------------------------------------
    Student.m
    #import "Student.h"
    
    @implementation Student
    
    //学生通过代理找房子
    -(void)findHourse{
        NSLog(@"学生想找房子");
        if ([self.delegate respondsToSelector:@selector(studentFindHourse:)]) {
            [self.delegate studentFindHourse:self];
        }
    }
    
    @end
    
    ----------------------------------------------------------------------------------------
    LoveHome.h
    #import <Foundation/Foundation.h>
    @protocol StudentProtocol;//标明StudentProtocol是一个协议
    
    //爱家,专做销售房子的代理
    @interface LoveHome : NSObject<StudentProtocol>
    
    @end
    
    ----------------------------------------------------------------------------------------
    LoveHome.m
    #import "LoveHome.h"
    #import "Student.h"
    
    @implementation LoveHome
    
    -(void)studentFindHourse:(Student *)student{
        NSLog(@"%s 帮忙找房子",__func__);
    }
    
    @end
    
    ----------------------------------------------------------------------------------------
    main.m
    #import <Foundation/Foundation.h>
    #import "Student.h"
    #import "LoveHome.h"
    
    int main(int argc, const char * argv[]) {
    
        Student *stu = [[Student alloc] init];
        LoveHome *lh = [[LoveHome alloc] init];
        stu.delegate = lh;
        [stu findHourse];
    
        return 0;
    }
    View Code

    根据规范,重写1:

    //Person.h
    #import <Foundation/Foundation.h>
    @class Person;
    
    @protocol PersonProtocol <NSObject>
    
    -(void)personWantToFindApartment:(Person *)person;
    
    @end
    
    //Person要找房子
    @interface Person : NSObject
    
    @property (nonatomic, assign) NSString *name;
    
    //找房子的代理
    @property (nonatomic, strong) id<PersonProtocol>delegate;
    
    //构造方法
    -(instancetype)initWithName:(NSString *)name withDelegate:(id<PersonProtocol>)delegate;
    
    //找房子
    -(void)wantToFindApartment;
    
    @end
    
    
    
    //Person.m
    #import "Person.h"
    
    //定义私有方法
    @interface Person()
    
    -(void)startFindApartment:(NSTimer *)timer;
    
    @end
    
    //实现Person
    @implementation Person
    
    -(instancetype) initWithName:(NSString *)name withDelegate:(id<PersonProtocol>)delegate{
        self = [super init];
        if (self) {
            self.name = name;
            self.delegate = delegate;
        }
        return self;
    }
    
    -(void) wantToFindApartment{
        [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(startFindApartment:) userInfo:@"代理找房子" repeats:YES];
    }
    
    //实现私有方法
    -(void) startFindApartment:(NSTimer *)timer{
        NSString *info = [timer userInfo];
        NSLog(@"1");
        if ([self.delegate respondsToSelector:@selector(personWantToFindApartment:)]) {
            NSLog(@"%@",info);
            [self.delegate personWantToFindApartment:self];
        }
    }
    
    @end
    
    
    
    //Agent.h
    //代理
    #import <Foundation/Foundation.h>
    @protocol PersonProtocol;
    
    @interface Agent : NSObject<PersonProtocol>
    
    @end
    
    
    //Agent.m
    #import "Agent.h"
    #import "Person.h"
    
    @implementation Agent
    
    -(void)personWantToFindApartment:(Person *)person{
        NSLog(@"%s 代理帮忙找房子",__func__);
    }
    
    @end
    
    
    
    //main.m
    #import <Foundation/Foundation.h>
    #import "Person.h"
    #import "Agent.h"
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            Agent *a = [[Agent alloc] init];
            Person *p = [[Person alloc] initWithName:@"keen" withDelegate:a];
    
            [p wantToFindApartment];
    
            [[NSRunLoop currentRunLoop] run];
        }
    
    
        return 0;
    }
    View Code
  • 相关阅读:
    PAT1001
    关于yahoo.com.cn邮箱导入Gmail邮箱验证异常的机制解析及解决办法
    浙大机试感受
    PAT1002
    mysql修改密码后无法登陆问题
    Windows 不能在 本地计算机 启动 OracleDBConsoleorcl
    Deprecated: Function ereg_replace() is deprecated
    PHP中静态方法(static)与非静态方法的使用及区别
    微信小程序开发,weui报“渲染层错误”的解决办法
    Android系统下载管理DownloadManager功能介绍及使用示例
  • 原文地址:https://www.cnblogs.com/KeenLeung/p/5016895.html
Copyright © 2011-2022 走看看