OC之正式協議總結

前言:

最近要學的東西好多,博客沒有太多時間去寫,但是還是要及時總結一下,否則即使用的很熟練,很多東西還是ran的不行~
上一篇寫了一個老闆出差的小demo,總結了一下非正式協議Extension,這一篇會寫一個相同的demo總結正式協議Protocol

1.Demo解釋

老闆又要去上海了!!
他很忙。。。然後呢,很多事情他拒絕自己去做,惜時如金!(其實他說謊。。。真正的原因我猜測是想要代碼更簡潔,耦合度更低,複用性更好!)
所以。。。買機票,買礦泉水,買麪包,算一路的花銷,處理走之前公司的煩人事務這些事情都要交給苦逼員工去做。那麼,我們就採用正式協議來完成,老闆包含兩個委託對象:一個遵守Prepare協議,買各種東西;另一個遵守Deal協議,處理煩人事務。然後創建兩個遵守協議的員工對象,把這兩個員工對象賦值給老闆的委託變量。那麼就可以調用員工的方法實現了。
老闆解脫了!如果老闆覺得員工乾的不好,就可以重新創建兩個員工變量,把委託對象賦值成新的員工變量,把原來的員工果斷裁掉!
OK,光說不練假把式,來demo~

2.Demo結構及代碼:

OC-正式協議demo

main.m

//現在用正式協議來實現老闆去上海開會問題,之前使用非正式協議來實現的

#import <Foundation/Foundation.h>
#import "Boss.h"
#import "Employee1.h"
#import "Employee2.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSLog(@"<<<<<<苦逼老闆>>>>>>");
//        boss是一個什麼事情都要自己去做的苦逼老闆
        Boss *boss=[[Boss alloc] init];
//       (1)正式協議不使用委託,只是當做方法必須全部實現的接口來用
        [boss buyTickets];
        [boss buyFoods];
        [boss buyWater];
        [boss dealWithThings];
        NSLog(@"<<<<<<聰明老闆>>>>>>");
//       (2)正式協議使用委託,可以選擇其它遵守該協議的委託對象來執行協議中的方法,直接調用就可以了
//        boss1是一個瑣碎事情可以交給下屬去做的聰明老闆
        Boss *boss1=[[Boss alloc] init];
        Employee1 *employee1=[[Employee1 alloc] init];
        Employee2 *employee2=[[Employee2 alloc] init];
        boss1.delegate_prepare=employee1;
        boss1.delegate_deal=employee2;
        [boss1 buyTickets];
        [boss1 buyFoods];
        [boss1 buyWater];
        [boss1 dealWithThings];
    }
    return 0;
}

Protocol

Deal.h
//Deal協議 -正式協議
#import <Foundation/Foundation.h>
@protocol Deal <NSObject>
-(void)dealWithThings;
@end
Prepare.h
#import <Foundation/Foundation.h>
//1.正式協議,需要實現所有方法:
//2.與非正式協議不同,正式協議在創建的時候不需要與任何類相關聯,也無法擴展屬性
@protocol Prepare <NSObject>
//遵守協議的類必須實現的方法
-(void)buyTickets;
-(void)buyWater;
-(void)buyFoods;

@optional//可選實現的方法
-(void)sayGoodBye;//給老闆送行
@end

Interface

Boss.h
#import <Foundation/Foundation.h>
#import "Prepare.h"//導入正式協議Prepare
#import "Deal.h"//導入正式協議Deal

//如果使用非正式協議的話,只要導入頭文件就可以了
//但是與非正式協議不同,正式協議必須尖括號顯式採用,多個協議用","隔開
@interface Boss : NSObject <Prepare,Deal>

@property(nonatomic,assign)id<Prepare> delegate_prepare;//遵守Prepare協議的委託人,關於Prepare的事情可以交給該委託人去做
@property(nonatomic,assign)id<Deal> delegate_deal;//遵守Deal協議的委託人,關於Deal的事情可以交給該委託人去做
-(void)gotoShangHai;//老闆想去上海開個會
@end
Boss.m
#import "Boss.h"

@implementation Boss
-(void)gotoShangHai{
    NSLog(@"老闆我想去上海開一個很重要的會議");
}
#pragma mark - Prepare協議
-(void)buyTickets{

    if ([_delegate_prepare respondsToSelector:@selector(buyTickets)])
    {//如果委託人實現了buyTickets方法
        [_delegate_prepare buyTickets];
    }
    else
    {
        NSLog(@"boss 我自己去買機票");
    }

}
-(void)buyWater{
    if ([_delegate_prepare respondsToSelector:@selector(buyWater)])
    {
        //如果委託人實現了buyWater方法
        [_delegate_prepare buyWater];

    }
    else
    {
        NSLog(@"boss 我自己去買水");
    }

}
-(void)buyFoods{
    if ([_delegate_prepare respondsToSelector:@selector(buyFoods)])
    {
        //如果委託人實現了buyFoods方法
        [_delegate_prepare buyFoods];

    }
    else
    {
        NSLog(@"boss 我自己去買食物");
    }
}
#pragma  mark - Deal協議
-(void)dealWithThings{
    if ([_delegate_deal respondsToSelector:@selector(dealWithThings)]) {//如果委託人實現了方法
        [_delegate_deal dealWithThings];
    }else{
        NSLog(@"boss 我自己去處理事情");
    }
}
@end
Employee1.h
#import <Foundation/Foundation.h>
#import "Prepare.h"//步驟1 導入正式協議
@interface Employee1 : NSObject <Prepare>//步驟2 顯式採用正式協議
@end
Employee1.m
#import "Employee1.h"
@implementation Employee1
//步驟3 實現正式協議中的方法
#pragma mark - Prepare協議
-(void)buyTickets{
    NSLog(@"Employee1 爲老闆去買機票");
}
-(void)buyWater{
    NSLog(@"Employee1 爲老闆去買水");
}
-(void)buyFoods{
    NSLog(@"Employee1 爲老闆去買食物");
}
@end
Employee2.h
#import <Foundation/Foundation.h>
#import "Deal.h"//步驟1 導入正式協議
@interface Employee2 : NSObject <Deal>//步驟2 遵守協議
@end
Employee2.m
#import "Employee2.h"
@implementation Employee2
-(void)dealWithThings{
    NSLog(@"Employee2 爲老闆處理走之前的事情");
}
@end

3.Demo運行結果:

這裏寫圖片描述

4.總結:

我的理解:正式協議的使用分爲兩種:
(1)不使用委託:
這種使用主要是完成多繼承
(2)使用委託:
這種使用主要是爲了代碼的松耦合。(我猜的)
OK,下一篇是OC中的類別,我再寫一個小demo總結下~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章