中介找房 - IOS

main.m

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Agent.h"
#import "Boss.h"
 int main(int argc, const char * argv[]) {
@autoreleasepool {
   
    /*
     *  0、寫代理的步驟
     
     *  1、 先寫協(xié)議
     
     *  2、 讓agent遵守協(xié)議,也就是說讓agent有能力找房子
     
     *  3、 采用@property定義一個(gè)代理屬性,
     
     *  4、 指定誰(shuí)幫我做事
     
     *  5、 指定誰(shuí)幫我做事以后,決定什么時(shí)候讓我指定的代理幫我做事
     
     *  6、 判斷指定的代理是否真的有能力做事
     
     *  7、 如果指定的代理會(huì)做事,才讓他幫我做事
     */
    
    
    
    
    
#pragma mark 假設(shè)有一個(gè)Jack的人(Person),他想租一套公寓(Apartment),由于他工作繁忙(或者其他原因),沒有時(shí)間(或者自身沒有能力)去租房。因此,他委托中介公司(Agent)幫他尋找房源,找到合適的房源告知Jack。
    
    /*
     * 分析:
     
       1. jack
       2. 中介
       3. 創(chuàng)建一個(gè)協(xié)議,協(xié)議里面聲明一個(gè)找房的方法
       4. 讓jack和中介遵守同一個(gè)協(xié)議,相當(dāng)于jack和中介同時(shí)聲明了協(xié)議里面的方法
     
       5. jack想租房子,但沒時(shí)間租,委托中介幫他租房
     
           1) 指定中介找房子
     
     
     
     * 思路:
     
        1. 創(chuàng)建Person對(duì)象,給對(duì)象名字和指定讓誰(shuí)找房子
     
        2. 讓我指定的中介幫我找房子
           
           1)先判斷中介是否有找房子的能力
           2)如果有的話,就讓他找房子
     
     
     */
    
    Agent *agent = [[Agent alloc]init];

    Person *jack = [[Person alloc]init];
    
    jack.name = @"jack";
    
    //4、 指定誰(shuí)幫我做事
    jack.delegate = agent;
    
    //5、 指定誰(shuí)幫我做事以后,決定什么時(shí)候讓我指定的代理幫我做事
    [jack wantToFindApartment];
    
    
    //讓runloop延遲6秒在退出
    NSDate *date = [NSDate date];
    
    [[NSRunLoop currentRunLoop] runUntilDate:[date dateByAddingTimeInterval:6]];
    
    
    
}
return 0;
}

Person.h

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


@interface Person : NSObject<FindApartment>

@property (nonatomic, copy) NSString *name;

/*
 * id: 因?yàn)槲覠o(wú)法確定讓誰(shuí)找房子,所以我采用id

 * <FindApartment> : 確保讓幫我找房子的對(duì)象遵循了找房子的協(xié)議

 * delegate: 是實(shí)例化出來(lái)的一個(gè)對(duì)象
 */


//3、 采用@property定義一個(gè)代理屬性,
@property (nonatomic,retain) id <FindApartment> delegate;



- (void)wantToFindApartment;

@end

Person.m

#import "Person.h"
#import "Agent.h"

@interface Person ()

- (void)startFindApartMent:(Person *)person;

@end

@implementation Person


- (void)wantToFindApartment{

//    //誰(shuí)調(diào)用wantToFindApartment self就是誰(shuí)
//    [self startFindApartMent:self];

/*
 * 用定時(shí)器,實(shí)現(xiàn)兩秒找一次房子
 
 * 第一個(gè)參數(shù): 指定一個(gè)時(shí)間
 
 * 第二參數(shù): 指定調(diào)用方法的對(duì)象
 
 * 第三個(gè)參數(shù): 時(shí)間到了執(zhí)行方法,@selector方法選擇器
 
    1. 如果方法選擇器選擇的方法帶『:』,說明選擇這個(gè)方法要有參數(shù),參數(shù)類型是NSTimer
 
    2. 如果沒有帶『:』,該方法沒有參數(shù)
 
 * userinfo:是一個(gè)參數(shù)
 
 * repeats:是否循環(huán)
 
 */

[NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(startFindApartMent:) userInfo:self repeats:YES];



}

- (void)startFindApartMent:(NSTimer *)timer{

//    NSLog(@"開始讓中介幫找房子");



/*
 * self.delegate 是在main.m中指定的幫我找房子的中介
 
 * 通過respondsToSelector方法,判斷Agent類中是否實(shí)現(xiàn)了找房子的方法
 
 * 如果實(shí)現(xiàn)了找房子的方法,變直接調(diào)用
 */


//6、 判斷指定的代理是否真的有能力做事

BOOL isShiXian = [self.delegate respondsToSelector:@selector(findApartMent:)];

ApartmentAgent agent;
if (isShiXian == YES) {
    
    //self.delegte就是main.m 中傳進(jìn)來(lái)的中介對(duì)象,可以打印出來(lái)自己看看,再此調(diào)用的findApartMent是Agent中的方法
    Agent *temp = self.delegate;
    
    //7、 如果指定的代理會(huì)做事,才讓他幫我做事
     agent = [temp findApartMent:timer.userInfo];
}

if (agent == kHighAgent) {
    
    NSLog(@"太貴了,不要");
    
}else if(agent == kMidAgent){
    
    NSLog(@"風(fēng)格不適合");
}else if(agent == kLowAgetn){
    
    NSLog(@"這個(gè)門不錯(cuò),要");
    
    [timer invalidate];
}



}

@end

Agent.h

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

//2、 讓agent遵守協(xié)議,也就是說讓agent會(huì)能力找房子
@interface Agent : NSObject<FindApartment>



@end

Agent.m

#import "Agent.h"
#import "Person.h"
@implementation Agent

- (ApartmentAgent)findApartMent:(Person *)person{


static int count = 0;
ApartmentAgent price;
if (count == 0) {
    
    NSLog(@"%@ 找到很好的房子,但價(jià)錢很高",person.name);
    
    price = kHighAgent;
}else if (count == 1){
    
    NSLog(@"%@ 找到一個(gè)還不錯(cuò)的房子,你就要了吧",person.name );
    
    price = kMidAgent;
}else if (count == 2){
    
    NSLog(@"%@ 找到一個(gè)便宜的房子,你看著辦吧",person.name);
    
    price = kLowAgetn;
}

count ++;


return price;


}


@end

FinderApartmentAgent.m

  #import <Foundation/Foundation.h>


  //用來(lái) 反饋公寓的價(jià)錢
  typedef enum : NSUInteger {
      kHighAgent = 0,
      kMidAgent,
      kLowAgetn,
  } ApartmentAgent;
  



  /*
   * 如果協(xié)議很多地方用的話,建議寫一個(gè)文件中
    * 如果協(xié)議用的地方不多的話,建議寫在一個(gè)類中
   */

 //1、 先寫協(xié)議
@class Person;
 /*
   * protocol是協(xié)議的關(guān)鍵字  
   * FindApartment是協(xié)議的名字

   * 協(xié)議的方法寫在@protocol和@end之間

   */
 @protocol FindApartment <NSObject>


/*
 * optional:方法可以實(shí)現(xiàn)也可以不實(shí)現(xiàn)

 * require:  方法必須的實(shí)現(xiàn),默認(rèn)都是require
 */

@optional  
- (ApartmentAgent)findApartMent:(Person *)person;



@end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • PearlParis閱讀 175評(píng)論 0 0
  • 暗戀,是想把世界上所有的美好都送給你,卻不敢承認(rèn)的懦弱;暗戀,是明明知道自己不會(huì)游泳,卻仍想在河里掙扎的愚...
    無(wú)心園閱讀 352評(píng)論 0 1
  • 這幾天在家休假,每天早上起來(lái),慢慢地吃過早餐,看太陽(yáng)冉冉升起,照在我家的陽(yáng)臺(tái)上。護(hù)欄邊我種的月季和西洋杜鵑開得正艷...
    芙蓉清露閱讀 271評(píng)論 0 0

友情鏈接更多精彩內(nèi)容