玩轉iOS開發:《iOS設計模式 — 代理模式》

目錄git


做者感言

上次咱們知道了單例模式是怎麼回事, 如今咱們來探討一下什麼叫作單例模式.github

其實所謂的代理模式在咱們平常生活中很是的常見, 好比買車, 各式各樣的牌子都有, 但這些汽車生產商又不可能本身掏錢在每一個城市的每一個角落都開一家本身的直營店, 因此他們會去招一些第三方的代理商進行分銷, 而這個就是咱們今天所要說的代理模式.objective-c

最後:
若是你有更好的建議或者對這篇文章有不滿的地方, 請聯繫我, 我會參考大家的意見再進行修改, 聯繫我時, 請備註代理模式, 若是以爲好的話, 但願你們也能夠打賞一下~嘻嘻~祝你們學習愉快~謝謝~學習

Cain(羅家輝)ui

聯繫方式: zhebushimengfei@qq.comatom

騰訊QQ: 350116542代理


簡介

UML

這是一張代理模式的UML圖, 一樣也很簡單的講解了代理模式究竟是怎麼回事code

順序以下:對象

  • 1.Client(客戶)Subject(代理店)發起購買汽車的請求
  • 2.Subject(代理店)會向Proxy(生產商)進行提單
  • 3.Proxy(生產商)按照提單進行交貨給Subject(代理店)
  • 4.Subject(代理點)再交付給Client(客戶),

建立工程

打開咱們本身建立的DesignPatternWork文件夾, 裏面有咱們以前所建立的DesignPatternWorkSpacestring

1

添加咱們所要建立的新工程, 命名爲ProxyPattern

2

3


建立代理類

聲明代理類

這裏咱們就拿奧迪這個汽車生產商來進行演示, 原諒我是個奧迪控~~

4


聲明代理方法

在這裏聲明兩個代理方法, 但他們有所區別, 一個是必須實現, 一個是可選類型的, 因爲方法名自注釋, 我這裏就不添加註釋了.

@required
- (void)audiManufacturer:(AudiManufacturer *)audiManufacturer
           orderQuantity:(NSInteger)orderQuantity;
@optional
- (void)audiManufacturer:(AudiManufacturer *)audiManufacturer
            audiDelegateInfo:(NSString *)audiDelegateInfo;

解釋一下, 爲何咱們須要在代理方法中提供代理類, 其實這個很好理解, 打個比方, 就拿奧迪來講吧, 一個品牌的車子, 確定有不一樣的型號, 而每一個型號不必定都是在同一家工廠裏生產的, 這個時候咱們就須要區分生產地, 因此咱們爲了提供外部去區分, 就須要在代理方法中提供代理類(我的理解, 不是官方語言哈).

5

#import <Foundation/Foundation.h>

@class AudiManufacturer;

@protocol AudiManufacturerDelegate <NSObject>

@required
- (void)audiManufacturer:(AudiManufacturer *)audiManufacturer
           orderQuantity:(NSInteger)orderQuantity;

@optional
- (void)audiManufacturer:(AudiManufacturer *)audiManufacturer
            audiDelegateInfo:(NSString *)audiDelegateInfo;
@end

@interface AudiManufacturer : NSObject

@property (nonatomic, weak) id<AudiManufacturerDelegate> delegate;

- (void)buyCarCount:(NSInteger)count;
- (void)buyCarModel:(NSString *)model;

@end

內部實現代理方法

在內部實現兩個對方開放的方法

6

#import "AudiManufacturer.h"

@implementation AudiManufacturer

- (void)buyCarCount:(NSInteger)count {

    if (self.delegate && [self.delegate respondsToSelector:@selector(audiManufacturer:orderQuantity:)]) {
        [self.delegate audiManufacturer:self orderQuantity:count];
    }
}

- (void)buyCarModel:(NSString *)model {

    if (self.delegate && [self.delegate respondsToSelector:@selector(audiManufacturer:audiDelegateInfo:)]) {
        [self.delegate audiManufacturer:self audiDelegateInfo:model];
    }
}

@end

外部調用代理

代理類以及代理方法咱們已經完成了, 接下來咱們就要在外部去實現了

7

#import "ViewController.h"
#import "AudiManufacturer.h"

@interface ViewController () <AudiManufacturerDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    AudiManufacturer *audiManufacturer = [[AudiManufacturer alloc] init];
    
    audiManufacturer.delegate = self;
    
    [audiManufacturer buyCarCount:2];
    [audiManufacturer buyCarModel:@"Q7"];
}

#pragma mark - 必須實現的方法
- (void)audiManufacturer:(AudiManufacturer *)audiManufacturer
           orderQuantity:(NSInteger)orderQuantity {
    
    NSLog(@"奧迪生產商爲: %@", audiManufacturer);
    NSLog(@"購買的數量爲: %zd", orderQuantity);
}

#pragma mark - 可選實現的方法
- (void)audiManufacturer:(AudiManufacturer *)audiManufacturer
        audiDelegateInfo:(NSString *)audiDelegateInfo {
    
    NSLog(@"奧迪生產商爲: %@", audiManufacturer);
    NSLog(@"購買的型號爲: %@", audiDelegateInfo);
}

@end

8


代理與協議的區別

代理與協議

到這裏, 咱們已經完成了整個代理模式的全部要求了, 但還有一些小細節須要提提.

代理職能:下降對象與對象之間的耦合度
協議職能:主要是用來約束對象或篩選對象
代理與協議的類似:代理與協議都是使用@protocol來進行聲明, 而且提供方法的一種模式, 看起來沒啥不同.
代理與協議的不一樣:其實就如同它們的職能所說, 代理是爲了下降對象與對象之間的耦合度, 協議是用來約束對象或篩選對象


建立協議

這裏咱們用代碼演示一下吧, 這樣子更加的簡單明瞭, 不過這裏要注意一下, Protocol是沒有.m文件的

9

#import <Foundation/Foundation.h>

@protocol AudiCustomerProtocol <NSObject>

@required
- (NSString *)isEnoughBuyCar:(NSInteger)money;

@end

建立顧客類

建立完協議就要建立顧客了, 而且這個顧客類是必須遵照咱們建立的Protocol, 而後在這個Protocol里加個判斷.

10

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

@interface Customer : NSObject <AudiCustomerProtocol>

@end

11

#import "Customer.h"

@implementation Customer

- (NSString *)isEnoughBuyCar:(NSInteger)money {

    if (money >= 1000000) {
        
        return @"您的錢足夠購買Q7";
    }
    
    return @"您的錢不足以購買Q7";
}

@end

如今咱們來初始化一下這個顧客類, 而且校驗一下咱們所寫的Protocol是否生效.

12

#import "ViewController.h"
#import "AudiManufacturer.h"
#import "Customer.h"

@interface ViewController () <AudiManufacturerDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    AudiManufacturer *audiManufacturer = [[AudiManufacturer alloc] init];
    
    audiManufacturer.delegate = self;
    
    [audiManufacturer buyCarCount:2];
    [audiManufacturer buyCarModel:@"Q7"];
    
    Customer *customer = [[Customer alloc] init];
    
    NSString *string = [customer isEnoughBuyCar:輸入你想要的數值];
    
    NSLog(@"%@", string);
}

#pragma mark - 必須實現的方法
- (void)audiManufacturer:(AudiManufacturer *)audiManufacturer
           orderQuantity:(NSInteger)orderQuantity {
    
    NSLog(@"奧迪生產商爲: %@", audiManufacturer);
    NSLog(@"購買的數量爲: %zd", orderQuantity);
}

#pragma mark - 可選實現的方法
- (void)audiManufacturer:(AudiManufacturer *)audiManufacturer
        audiDelegateInfo:(NSString *)audiDelegateInfo {
    
    NSLog(@"奧迪生產商爲: %@", audiManufacturer);
    NSLog(@"購買的型號爲: %@", audiDelegateInfo);
}

@end

先輸入10000

13

再輸入1000000

14


補充一點

其實在iOS中, 就有一個類叫作NSProxy, 它也能夠用來實現代理模式, 但在這裏先不作介紹, 後面有時間再另外寫一篇文章去講解怎麼用NSProxy去實現代理模式, 若是有好奇心特別重的朋友, 也能夠自行去翻查一下資料~


最後總結

通過上面的演示, 就知道代理模式並無想象中那麼複雜, 說白了, 所謂的代理模式就是爲了下降對象與對象之間的耦合度, 爲了方便維護罷了, 同時咱們也知道了代理協議之間的區別, 這篇文章就到了, 謝謝你們的觀看~

GitHub工程地址: https://github.com/CainRun/DesignPattern

相關文章
相關標籤/搜索