设计模式之代理

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;

}
时间: 2024-11-01 13:20:02

设计模式之代理的相关文章

深入理解JavaScript系列(31):设计模式之代理模式详解

 这篇文章主要介绍了深入理解JavaScript系列(31):设计模式之代理模式详解,代理模式使得代理对象控制具体对象的引用,代理几乎可以是任何对象:文件,资源,内存中的对象,或者是一些难以复制的东西,需要的朋友可以参考下     介绍 代理,顾名思义就是帮助别人做事,GoF对代理模式的定义如下: 代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. 代理模式使得代理对象控制具体对象的引用.代理几乎可以是任何对象:文件,资源,内存中的对象,或者是一些难以复制的东西. 正文 我们

C#设计模式(13)——代理模式(Proxy Pattern)

原文:C#设计模式(13)--代理模式(Proxy Pattern) 一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让代理对象代替目标对象,然后客户端只需要访问代理对象,由代理对象去帮我们去请求目标对象并返回结果给客户端,这样的一个解决思路就是今天要介绍的代理模式. 二.代理模式的详细介绍 代理模式按照使用目的可以分为以下几种: 远程(Remote

乐在其中设计模式(C#) - 代理模式(Proxy Pattern)

原文:乐在其中设计模式(C#) - 代理模式(Proxy Pattern)[索引页][源码下载] 乐在其中设计模式(C#) - 代理模式(Proxy Pattern) 作者:webabcd 介绍 为其他对象提供一个代理以控制对这个对象的访问. 示例 有一个Message实体类,某对象对它的操作有Insert()和Get()方法,用一个代理来控制对这个对象的访问. MessageModel using System;using System.Collections.Generic;using Sy

java 程序性能优化《第二章》设计优化 2.1善用设计模式 2 代理模式

java 程序性能优化<第二章>设计优化 2.1善用设计模式 2 代理模式 代理模式也是一种很常见的设计模式.它使用代理对象完成用户请求,屏蔽用户对真实对象的访问.就如同现实中的代理一样,代理人被授权执行当事人的一些适宜,而无需当事人出面,从第三方的角度看,似乎当事人并不存在,因为他只和代理人通信.而事实上,代理人是要有当事人的授权,并且在核心问题上还需要请示当事人. 在现实中,使用代理的情况很普遍,而且原因也很多.比如,当事人因为某些隐私不方便出面,或者当事人不具备某些相关的专业技能,而需要

设计模式之七(代理模式)

原文:设计模式之七(代理模式) 前言 代理模式:为其他对象提供一种代理以控制对这个对象的访问. 结构图   Subject类,定义了RealSubject和Proxy的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy. RealSubject类,定义Proxy所代表的真实实体 Proxy类,保存一个引用使得代理可以访问实体,并提供一个与Subject的接口相同的接口,这样代理就可以来替代实体. 实例代码  Subject类 public abstract class S

【设计模式】—— 代理模式Proxy

模式意图 代理模式为其他的对象增加一个代理对象,进行访问控制.从而避免直接访问一个对象,造成效率或者安全性上的降低. 应用场景 1 远程代理,为一个远程对象,创建一个本地的代理对象.每次访问,直接访问本地代理对象即可. 2 虚代理,如果对象很大,直接访问开销很大,可以为他创建一个代理对象,只生成关键的信息即可. 3 保护代理,为某个对象增加一种保护机制,只有一定的权限才能通过这个代理,访问后面的对象. 4 智能指针,有点像C++里面的那个智能指针,为指针进行计数和销毁等操作.避免出现悬垂指针等现

设计模式之代理模式(Proxy Pattern)

1 代理模式定义 定义:给某个对象提供一个代理对象,并由代理对象控制对于原对象的访问,即客户不直接操控原对象,而是通过代理对象间接地操控原对象. 本篇文章主要介绍的是静态代理,关于动态代理请参考:设计模式之动态代理(dynamic proxy) 2 代理模式的作用 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 通过代理类对原有类进行功能增强,如增加缓存.异常处理.日志处理等,Spring AOP用的就是(动态)代理模式 3 代理模式一

设计模式:代理模式(Proxy)

 代理模式:为其他对象提供一种代理以控制对这个对象的访问. 代理模式中的角色: 抽象主题角色(Subject):声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象. 具体主题角色(RealSubject):也称为委托角色或者被代理角色.定义了代理对象所代表的目标对象. 代理主题角色(Proxy):也叫委托类.代理类.代理对象内部含有目标对象的引用,从而可以在任何时候操作目标对象:代理对象提供一个与目标对象相同的接口,以便可以在任何时候替代目标对象.代理对象

设计模式之代理模式

设计模式,六大设计原则,类的特性 总纲 http://blog.csdn.net/fenglailea/article/details/52733435 风.fox 代理模式 Proxy Pattern 为其他对象提供一种代理以控制对这个对象的访问 代理模式也叫委托模式 通用类图 组成 抽象主题 Subject 抽象主题类可以是抽象类也可以是接口,是一个最普通的业务类型定义,无特殊要求 具体主题 RealSubject 也叫做被委托角色.被代理角色.它才是冤大头,是业务逻辑的具体执行者 代理主题