设计模式之代理

简介:

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<span style="color: rgb(255, 0, 0); background-color: rgb(255, 255, 255);"><myprotocol>

</span>

.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<span style="color: rgb(255, 0, 0);"><myprotocol></span>

@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;

}

相关文章
|
4月前
|
设计模式 XML JSON
二十三种设计模式全面解析-代理模式进阶篇:揭秘远程代理
二十三种设计模式全面解析-代理模式进阶篇:揭秘远程代理
|
7月前
|
设计模式 缓存 安全
设计模式之代理模式的懂静态代理和动态代理
设计模式之代理模式的懂静态代理和动态代理
62 0
|
2月前
|
设计模式 缓存 安全
设计模式-代理模式(静态代理、动态代理、cglib代理)、代理模式和装饰者模式的区别
设计模式-代理模式(静态代理、动态代理、cglib代理)、代理模式和装饰者模式的区别
55 1
|
3月前
|
设计模式
装饰者设计模式(二)番外篇 装饰者设计模式和静态代理设计模式区别
装饰者设计模式(二)番外篇 装饰者设计模式和静态代理设计模式区别
|
5月前
|
设计模式 Java
设计模式之代理模式(静态&动态)代理
二十三种设计模式中的一种,属于结构型模式。它的作用就是通过提供一个代理类,让我们在调用目标方法的时候,不再是直接对目标方法进行调用,而是通过代理类间接调用。让不属于目标方法核心逻辑的代码从目标方法中剥离出来——解耦。调用目标方法时先调用代理对象的方法,减少对目标方法的调用和打扰,同时让附加功能能够集中在一起也有利于统一维护。
24 0
|
11月前
|
设计模式 大数据
大数据开发基础的设计模式的代理
代理模式是大数据开发基础的设计模式之一。它是一种结构型模式,用于为其他对象提供一种代理以控制对这个对象的访问。代理模式可以在不改变原始类代码的情况下,对原始类进行扩展或增强。
60 0
|
12月前
|
设计模式 缓存 前端开发
前端通用编程基础的设计模式之代理
代理模式是一种常见的设计模式,它可以帮助我们在不改变原始代码的情况下增加新的功能,并且可以实现对对象的控制。下面就让我们来看看代理模式的特点和优势。
54 0
|
12月前
|
设计模式 Java
设计模式-代理设计模式
代理模式(Proxy) 代理模式的基本介绍 1、代理模式:为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象,这样做的好处是,可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。 2、代理模式有不同的形式,主要有三种,静态代理、jdk代理(也叫接口代理)、cglib代理(可以在内存中动态的创建对象,而不需要实现接口)。
67 0
|
设计模式 数据采集 Java
java设计模式之代理设计模式(Spring核心思想AOP的底层设计模式)
代理设计模式 🍅 作者:程序员小王 🍅 程序员小王的博客:程序员小王的博客 🍅 扫描主页左侧二维码,加我微信 一起学习、一起进步 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕 🍅java自学的学习路线:java自学的学习路线
94 0
java设计模式之代理设计模式(Spring核心思想AOP的底层设计模式)
|
设计模式 Java
Java设计模式之:静态代理
Java设计模式之:静态代理
68 0