OC中的设计模式(代理设计模式)(类目)

来源:互联网 发布:国外论文一手数据 编辑:程序博客网 时间:2024/05/19 03:45
 类目:对现有类的扩展,为不想改动的类增加方法。
注意点:类目里面无法添加性的实例变量
                在类目中覆盖现有类的方法,会引起super消息的断链。
类目的使用方式有多种
   1、直接写在类中。
 
#import <Foundation/Foundation.h>


@interface Person : NSObject

{

    int _age;


    NSString *_name;

}

@property int age;


@property NSString *name;


- (void)show;

@end


@interface Person (Life)


- (void)eat;


- (void)run;


- (void)sleep;


@end


@interface Person (Create)

- (id)personWithName:(NSString *)name;

+ (id)personWithName:(NSString *)name withAge:(int)age;

- (id)initWithName:(NSString *)name;

- (id)initWithName:(NSString *)name withAge:(int)age;

@end 
---------------------------------------------------------------------------------------------

#import "Person.h"


@implementation Person

- (void)show{

    NSLog(@"我是对象的方法,不是类目中的方法。%@,%d",_name,_age);

}

@end

@implementation Person(Life)

- (void)eat{

    NSLog(@"开始吃饭");

}


- (void)run{

    NSLog(@"开始跑了");

}


- (void)sleep{

    NSLog(@"睡觉了");

}


@end

@implementation Person (Create)

- (id)personWithName:(NSString *)name{

    Person *p = [[Person alloc]init];

    p.name = name;

    return p;

}


+ (id)personWithName:(NSString *)name withAge:(int)age{

    Person *p = [[Person alloc]init];

    p.name = name;

    p.age = age;

    return p;

}


- (id)initWithName:(NSString *)name{

    if(self = [super init]){

        self.name = name;

    }

    return self;

}


- (id)initWithName:(NSString *)name withAge:(int)age{

    if(self = [super init]){

        self.name = name;

        self.age =age;

    }

    return self;

}


@end

 ----------------------------------------------------------------------------------

#import <Foundation/Foundation.h>

#import "Person.h"

int main(int argc, const char * argv[]) {

    Person *p = [[Person allocinitWithName:@"merray" withAge:15];

    [p show];

    [p eat];

    [p run];

    return 0;

}

-------------------------------------------------------------------------------------
 2、定义成单独的文件

#import "Person.h"

@interface Person (PersonCategory)


- (id)personWithName:(NSString *)name;


+ (id)personWithName:(NSString *)name andAge:(int)age;


- (id)initWithAge:(int)age andName:(NSString *)name;


-(id)initWithName:(NSString *)name;

@end


------------------------------------------------------------------------------

#import "Person+PersonCategory.h"


@implementation Person (PersonCategory)

- (id)personWithName:(NSString *)name{

    Person *p =[Person new];

    p.name =name;

    return p;

}


+ (id)personWithName:(NSString *)name andAge:(int)age{

    Person *p = [Person new];

    p.name = name;

    p.age = age;

    return p;

}


- (id)initWithAge:(int)age andName:(NSString *)name{

    if(self = [super init]){

        self.name = name;

        self.age = age;

    }

    return self;

}


-(id)initWithName:(NSString *)name{

    if(self = [super init]){

        self.name =name;

    }

    return self;

}


@end

---------------------------------------------------------------------------


#import <Foundation/Foundation.h>


@interface Person : NSObject

{

    int _age;


    NSString *_name;

}

@property int age;


@property NSString *name;


- (void)show;

@end


@interface Person (Life)


- (void)eat;


- (void)run;


- (void)sleep;


@end

----------------------------------------------------------------

#import "Person.h"


@implementation Person

- (void)show{

    NSLog(@"我是对象的方法,不是类目中的方法。%@,%d",_name,_age);

}

@end

@implementation Person(Life)

- (void)eat{

    NSLog(@"开始吃饭");

}


- (void)run{

    NSLog(@"开始跑了");

}


- (void)sleep{

    NSLog(@"睡觉了");

}

@end

--------------------------------------------------------------

#import <Foundation/Foundation.h>

#import "Person.h"

#import "Person+PersonCategory.h"

int main(int argc, const char * argv[]) {

    Person *p = [[Person allocinitWithAge:18 andName:@"dedede"];

    [p show];

    [p eat];

    [p run];

    return 0;

}
很简单,实质就是方法的添加。



代理设计模式

 代理指的是一个对象提供机会对另一个对象的行为发生变化时做出的反应。

 实质就是两个对象协调起来一起解决问题。 
 

#import <Foundation/Foundation.h>


@protocol helloProtocol <NSObject>


    - (void)requiredMethod;


@optional
 

    - (void)optionalMethod1;


    - (void)optionalMethod2;


@陈大哥end 
----------------------------------------------------------------

#import <Foundation/Foundation.h>

#import "helloProtocol.h"

@interface Person : NSObject<helloProtocol>

- (void)requiredMethod;


- (void)optionalMethod1;


- (void)optionalMethod2;

@end 
----------------------------------------------------------------

#import "Person.h"


@implementation Person

- (void)requiredMethod{

    NSLog(@"这个是一个必须实现的方法");

}

- (void)optionalMethod1{

NSLog(@"这个是一个可选实现的方法1");

}

- (void)optionalMethod2{

    NSLog(@"这个是一个可选实现的方法2");

}

@end 
----------------------------------------------------------------

int main(int argc, const char * argv[]) {

    Person *p = [Person new];

    [p requiredMethod];

    [p optionalMethod1];

    [p optionalMethod2];

    return 0;

}
-----------------------------------------------------------------



#import 
<Foundation/Foundation.h>

@class Person;

typedef enum _CZHouseRent{

    CZHouseRentHighRent,

    CZHouseRentMidRent,

    CZHouseRentLowRent

}CZHouseRent;

@protocol FindApartMent <NSObject>


- (CZHouseRent)FindApartMent:(Person *)person;


@陈大哥end
----------------------------------------------------------------

#import <Foundation/Foundation.h>

#import "FindApartMent.h"

@interface Agent : NSObject<FindApartMent>

- (CZHouseRent)FindApartMent:(Person *)person;

@end

----------------------------------------------------------------

#import "Agent.h"


@implementation Agent

static int count  =1;

- (CZHouseRent)FindApartMent:(Person *)person{

    NSLog(@"find");

    CZHouseRent rent;

    if(count == 1){

        NSLog(@"价格有点高");

        rent = CZHouseRentHighRent;

    }else if(count == 2){

        NSLog(@"价格还好");

        rent = CZHouseRentMidRent;

    }else{

        NSLog(@"价格比较低");

        rent = CZHouseRentLowRent;

    }

    count++;

    return rent;

}

@end 
---------------------------------------------------

#import <Foundation/Foundation.h>

#import "FindApartMent.h"

@interface Person : NSObject

{

    @private

    NSString *_name;

    id<FindApartMent> _delegate;//这个成员变量具备协议里面的方法

    int _houseRent;

}

@property NSString *name;

@property id<FindApartMent> delegate;

- (id)initWithName:(NSString *)name andDelegate:(id<FindApartMent>)delegate;

- (void)wantoFindApartment;

@end

----------------------------------------------------

#import "Person.h"


@interface Person()


- (void)startFindApartment:(NSTimer *)time;//定义私有方法


@end


@implementation Person


- (id)initWithName:(NSString *)name andDelegate:(id<FindApartMent>)delegate{

    if(self = [super init]){

        self.name = name;

        self.delegate =delegate;//设置代理

    }

    return self;

}


- (void)wantoFindApartment{

    [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(startFindApartment:) userInfo:nil repeats:YES];

    //通过指定定时器,感觉跟跳转差不错。跟java中线程的那个版块一样。每隔多少秒执行一次,指定的函数,并且指定调用函数的对象,指定被调的函数。

}

- (void)startFindApartment:(NSTimer *)time{

    CZHouseRent rent;

    if([self.delegate respondsToSelector:@selector(FindApartMent:)]){

      rent = [self.delegate FindApartMent:self];

    }

    if(rent  == CZHouseRentHighRent){

        NSLog(@"太贵了");

    }else if(rent == CZHouseRentMidRent){

        NSLog(@"我再看看");

    }else{

        NSLog(@"感觉还行");

        [time invalidate];

    }

}

@end 

---------------------------------------------------------------
 #import <Foundation/Foundation.h>

#import "Agent.h"

#import "Person.h"

int main(int argc, const char * argv[]) {

    Agent *a = [Agent new];

    Person *p = [[Person alloc]initWithName:@"jack" andDelegate:a];

    [p wantoFindApartment];

//    [[NSRunLoop currentRunLoop]run];

    NSDate *date = [NSDate new];

    [[NSRunLoop currentRunLooprunUntilDate:[date dateByAddingTimeInterval:6]];//

    return 0;

}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 建筑公司挂靠发生人员伤残怎么办 外地生小孩落北京户口怎么办 户籍档案查不到直系亲属关系怎么办 考过了二建注册怎么办 异地工作辞职回家档案怎么办 离职怎么办档案放在人才市场 人才房住了6年后怎么办 医保辞职后断了怎么办 社保断了生育险怎么办 深圳小产权房水电费纠纷怎么办 有公租房的再婚怎么办 廉租房被没收了怎么办 商铺到期房东不续租怎么办 天津集体户口买不起房怎么办 房东不想续租了怎么办 唯一住房卖掉后户口怎么办 杭州唯一住房卖掉后户口怎么办 唯一一套住房卖掉户口怎么办 房租押金条丢了怎么办 二建证书跟毕业证丢失怎么办 住宅房到70年怎么办 护照号变了机票怎么办 苹果se指纹坏了怎么办 月经推迟怎么办才能快点来 车载支架不粘了怎么办 otpc平板电脑无法开机怎么办 手表表轴掉了怎么办 鸡肉放冰箱臭了怎么办 鸡胸肉熟了腥怎么办 梦幻西游手游手机号换了怎么办 ppt做一半卡住了怎么办 吃了发霉的蚝油怎么办 蛋皮干燥起皮怎么办 wps卡顿资料没保存怎么办 手指受伤肉掉了怎么办 手机被wifi禁了怎么办 母乳一边是咸的怎么办 tcl电视蓝频了怎么办 长虹电视蓝频了怎么办 电视突然蓝频了怎么办 海信电视蓝频了怎么办