目录git
上次咱们知道了单例模式是怎么回事, 如今咱们来探讨一下什么叫作
单例模式
.github其实所谓的代理模式在咱们平常生活中很是的常见, 好比买车, 各式各样的牌子都有, 但这些汽车生产商又不可能本身掏钱在每一个城市的每一个角落都开一家本身的直营店, 因此他们会去招一些第三方的代理商进行分销, 而这个就是咱们今天所要说的
代理模式
.objective-c最后:
若是你有更好的建议或者对这篇文章有不满的地方, 请联系我, 我会参考大家的意见再进行修改, 联系我时, 请备注代理模式
, 若是以为好的话, 但愿你们也能够打赏一下~嘻嘻~祝你们学习愉快~谢谢~学习
Cain(罗家辉)ui
联系方式: zhebushimengfei@qq.comatom
腾讯QQ: 350116542代理
这是一张
代理模式
的UML图, 一样也很简单的讲解了代理模式
究竟是怎么回事code顺序以下:对象
- 1.
Client(客户)
向Subject(代理店)
发起购买汽车的请求- 2.
Subject(代理店)
会向Proxy(生产商)
进行提单- 3.
Proxy(生产商)
按照提单进行交货给Subject(代理店)
- 4.
Subject(代理点)
再交付给Client(客户)
,
打开咱们本身建立的
DesignPatternWork
文件夹, 里面有咱们以前所建立的DesignPatternWorkSpace
string
添加咱们所要建立的新工程, 命名为
ProxyPattern
建立代理类
这里咱们就拿奥迪这个汽车生产商来进行演示, 原谅我是个奥迪控~~
在这里声明两个代理方法, 但他们有所区别, 一个是必须实现, 一个是可选类型的, 因为方法名自注释, 我这里就不添加注释了.
@required - (void)audiManufacturer:(AudiManufacturer *)audiManufacturer orderQuantity:(NSInteger)orderQuantity;
@optional - (void)audiManufacturer:(AudiManufacturer *)audiManufacturer audiDelegateInfo:(NSString *)audiDelegateInfo;
解释一下, 为何咱们须要在代理方法中提供代理类, 其实这个很好理解, 打个比方, 就拿奥迪来讲吧, 一个品牌的车子, 确定有不一样的型号, 而每一个型号不必定都是在同一家工厂里生产的, 这个时候咱们就须要区分生产地, 因此咱们为了提供外部去区分, 就须要在代理方法中提供代理类
(我的理解, 不是官方语言哈)
.
#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
在内部实现两个对方开放的方法
#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
代理类以及代理方法咱们已经完成了, 接下来咱们就要在外部去实现了
#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
代理与协议的区别
到这里, 咱们已经完成了整个代理模式的全部要求了, 但还有一些小细节须要提提.
代理职能:
下降对象与对象之间的耦合度
协议职能:
主要是用来约束对象或筛选对象
代理与协议的类似:
代理与协议都是使用@protocol
来进行声明, 而且提供方法的一种模式, 看起来没啥不同.
代理与协议的不一样:
其实就如同它们的职能所说,代理
是为了下降对象与对象之间的耦合度,协议
是用来约束对象或筛选对象
这里咱们用代码演示一下吧, 这样子更加的简单明了, 不过这里要注意一下,
Protocol
是没有.m
文件的
#import <Foundation/Foundation.h> @protocol AudiCustomerProtocol <NSObject> @required - (NSString *)isEnoughBuyCar:(NSInteger)money; @end
建立完协议就要建立顾客了, 而且这个顾客类是必须遵照咱们建立的
Protocol
, 而后在这个Protocol
里加个判断.
#import <Foundation/Foundation.h> #import "AudiCustomerProtocol.h" @interface Customer : NSObject <AudiCustomerProtocol> @end
#import "Customer.h" @implementation Customer - (NSString *)isEnoughBuyCar:(NSInteger)money { if (money >= 1000000) { return @"您的钱足够购买Q7"; } return @"您的钱不足以购买Q7"; } @end
如今咱们来初始化一下这个顾客类, 而且校验一下咱们所写的
Protocol
是否生效.
#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
再输入
1000000
其实在iOS中, 就有一个类叫作
NSProxy
, 它也能够用来实现代理模式
, 但在这里先不作介绍, 后面有时间再另外写一篇文章去讲解怎么用NSProxy
去实现代理模式, 若是有好奇心特别重的朋友, 也能够自行去翻查一下资料~
通过上面的演示, 就知道
代理模式
并无想象中那么复杂, 说白了, 所谓的代理模式
就是为了下降对象与对象之间的耦合度, 为了方便维护罢了, 同时咱们也知道了代理
与协议
之间的区别, 这篇文章就到了, 谢谢你们的观看~
GitHub工程地址: https://github.com/CainRun/DesignPattern