设计模式之代理

本文深入探讨了 Objective-C 中的代理设计模式及其应用,通过具体实例展示了如何声明协议、实现协议和使用代理。重点阐述了协议与接口的概念相似性,以及在实现多继承时的不同之处。此外,通过示例代码详细说明了如何在类中声明和调用协议方法,以及如何通过代理机制实现多态性。

1.首先协议声明

@protocol myprotocol<NSObject>
@required
-(void)sum:(int)a param:(int)b;
@optional
-(void)add:(int)m param:(int)n;
@end

 2.类实现协议

 .h文件中

@interface Person : NSObject<myprotocol>

 .m文件中

-(void)sum:(int)a param:(int)b;
{
    NSLog(@"a+b=%d",a+b);
}

 3.实现方法的调用

  Person *p=[[Person alloc]init];
  [p sum:66 param:99];

上述代码声明了一个协议,并将Peoson类实现这个协议,此时改person类就有了改方法,可见person类的.h文件中并未声明 -(void)sum:(int)a param:(int)b;方法,在外部一样可以调用。

OC中的协议与C#的接口类似,都是为了实现多继承(oc、C#都是单继承,要实现多继承可用接口实现),只是OC中有@optional(可选)、@required(必须)之分,而C#中基类继承的接口就必须都要有实现。

4.代理的使用

代理设计模式运用面向接口的编程思想,体现了面向对象的多态的特征。

在OC中使用代理

(1)首先声明一个协议(接口)如上协议声明

(2)在类中声明一个协议类型的属性

@property(nonatomic,weak)id<myprotocol> myprotocoldelagate;

 (3)在类中通过协议类型的属性调用协议中的方法

[_myprotocoldelagate sum:m param:n];

 (4)在实现协议的类中实现协议的方法

.h文件中声明实现协议

@interface son : NSObject<myprotocol>
@end

 .m文件中实现协议方法

@implementation son
-(void)sum:(int)a param:(int)b;
{
    NSLog(@"test%d",a+b);
}
@end

  (5)代理的使用

    1.实例化声明协议为属性的类

    2.实例化实现协议的类,并将其赋值给1实例化的协议类型的属性

    3.调用1类协议属性的方法实现调用

详细代码如下:

preson类 新建myprotocol协议并将改协议做为类的一个属性  .h  文件

#import <Foundation/Foundation.h>
@protocol myprotocol<NSObject>
@required
-(void)sum:(int)a param:(int)b;
@optional
-(void)add:(int)m param:(int)n;
@end

@interface Person : NSObject

@property(nonatomic,weak)id<myprotocol> myprotocoldelagate;
-(void)fun:(int)m param:(int)n;
@end

 .m文件

#import "Person.h"

@implementation Person
/*-(void)sum:(int)a param:(int)b;
{
    NSLog(@"a+b=%d",a+b);
}*/

-(void)fun:(int)m param:(int)n
{
    [_myprotocoldelagate sum:m param:n];
}
@end

 实现协议的son类 .h文件

#import <Foundation/Foundation.h>

@interface son : NSObject<myprotocol>
@end

 .m文件

#import "son.h"
@implementation son
-(void)sum:(int)a param:(int)b;
{
    NSLog(@"test%d",a+b);
}
@end

 在Main文件中

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

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
//        Person *p=[[Person alloc]init];
//        [p sum:66 param:99];
        
        son *son1=[[son alloc]init];
        Person *p=[[Person alloc]init];
        p.myprotocoldelagate=son1; //  多态思想 运行时多态 父类指针可以指向子类的对象
        [p fun:55 param:88];

        
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值