zoukankan      html  css  js  c++  java
  • 设计模式之代理

    1.首先协议声明

    1
    2
    3
    4
    5
    6
    @protocol myprotocol<NSObject>
    @required
    -(void)sum:(int)a param:(int)b;
    @optional
    -(void)add:(int)m param:(int)n;
    @end

     2.类实现协议

     .h文件中

    1
    2
    @interface Person : NSObject<myprotocol>
    </myprotocol>

     .m文件中

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

     3.实现方法的调用

    1
    2
    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)在类中声明一个协议类型的属性

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

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

    1
    [_myprotocoldelagate sum:m param:n];

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

    .h文件中声明实现协议

    1
    2
    @interface son : NSObject<myprotocol>
    @end

     .m文件中实现协议方法

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

      (5)代理的使用

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

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

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

    详细代码如下:

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #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文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #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文件

    1
    2
    3
    4
    5
    #import <foundation foundation.h="">
     
    @interface son : NSObject<myprotocol>
    @end
    </myprotocol></foundation>

     .m文件

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

     在Main文件中

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #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;
    }
  • 相关阅读:
    Windows中启动和关闭Oracle服务的x.bat批处理文件
    Flex删除文件 SecurityError: fileWriteResource
    Eclipse中的@Override标注报错
    Flex删除文件 SecurityError: fileWriteResource
    commonsfileupload 上传文件乱码问题
    Eclipse中的@Override标注报错
    Windows中启动和关闭Oracle服务的x.bat批处理文件
    csdn论坛最近又有人灌水
    用JavaScript获取URL中的参数值
    用JavaScript获取URL中的参数值
  • 原文地址:https://www.cnblogs.com/yulei126/p/6783259.html
Copyright © 2011-2022 走看看