初识Objecive-C之 委托模式

本文介绍了委托模式的概念及其在厂长与车间主任工作场景中的应用,并结合单例模式实现了一个具体的示例。通过该示例,展示了如何利用Objective-C进行委托及单例的实现。

委托模式:为其他对象提供一种委托以控制对这个对象的访问。理解委托:比如说卖房子得问题,房东一般不直接去卖防止,而是通过中介间接卖,那么中介就是房东的委托,房东委托中介去卖房子。这就是委托模式。


委托与单例混合实现:


厂长和车间主任之间的工作例子。

厂长类:

//厂长类

#import <Foundation/Foundation.h>

#import "PProtocol.h"

@class FManager;

@interface FManager : NSObject


@property (retain,nonatomic)id<PProtocol>delegate;

@property (retain,nonatomic)NSString *name;


//生产的方法

- (void) production;

//单例方法

+(id)getInstance;


@end



#import "FManager.h"


//设置全局变量

static FManager *fm =nil;

@implementation FManager


- (void)production{

    NSLog(@"车间主任完成生产任务!");

    //判断是否遵循了协议

    if ([self.delegateconformsToProtocol:@protocol(PProtocol) ]) {

        //判断是否响应方法

        if ([self.delegaterespondsToSelector:@selector(startProduce)]) {

            [self.delegatestartProduce];

        }

    }

}

//实现工厂方法,返回单一对象

+ (id)getInstance{

    //锁方法

    @synchronized(self){

        //如果对象等于nil则创建对象,如果不为空就返回当前对象

        if (fm ==nil) {

            fm = [[FManageralloc]init];

        }

    }

    return fm;

}


//防止通过alloc、new方法创建新的实例 重写allocWithZone方法

+ (id)allocWithZone:(NSZone *)zone{

    @synchronized(self){

        if (fm ==nil) {

            fm = [superallocWithZone:zone];

        }

    }

    return fm;

}


//防止通过copy创建新的实例,重写copyWithZone方法

+ (id)copyWithZone:(NSZone *)zone{

    

    return self;

}


//重写retainCount方法,防止dealloc,此方法中返回最大值

- (NSUInteger)retainCount{

    

    returnNSUIntegerMax;

}


//重写retain方法 单例不释放 引用计数变化没有意义

- (id)retain{

    

    return self;

}


//重写release方法 单例不释放 引用计数变化没有意义

- (oneway void)release{

    

}


//重写autorelease方法 单例不释放 引用计数变化没有意义

- (id)autorelease{

    

    return self;

}


@end


车间主任类:

#import <Foundation/Foundation.h>

#import "PProtocol.h"

//设置车间主任要遵循的协议

@interface WManager : NSObject <PProtocol>



@end


#import "WManager.h"


@implementation WManager

//车间主任必须要实现的方法

- (void)startProduce{

    

    NSLog(@"报告厂长已经超额完成任务!");

}


@end


协议:

#import <Foundation/Foundation.h>


@protocol PProtocol <NSObject>

//协议中得方法

- (void)startProduce;


@end



main函数:

#import <Foundation/Foundation.h>


#import "FManager.h"//导入厂长类的头文件

#import "WManager.h"//导入车间主任的头文件


int main(int argc,constchar * argv[])

{


    @autoreleasepool {

        

        /*

         1、定义厂长类,定义生产协议。声明遵守该协议的委托对象

         2、在厂长类中定义生产方法

         3、定义车间主任类,遵守厂长的生产协议方法

         4、在主函数中实例化厂长和车间主任类,设置厂长类对象的delegate为车间主任类的对象

         5、厂长类的单例实现

         */

        

        //实例化wMangager车间主任类

        //实例化fManager厂长类

        WManager *wManager = [[WManageralloc]init];

        FManager *fManeger = [[FManageralloc]init];

        //厂长的委托就是车间主任的实例化对象

        fManeger.delegate = wManager;

        //调用厂长下生产命令的方法

        [fManeger production];

        

        //单例测试

        /*

        FManager *fm1 = [FManager getInstance];

        fm1.name = @"小三";

        NSLog(@"fm1=%p",fm1);

        //fm1和fm2的地址是一样的

        FManager *fm2 = [FManager getInstance];

        fm2.name = @"小二";

        NSLog(@"fm2=%p",fm2);

         */

        

        //释放对象

        [fManeger release];

        [wManager release];

        

    }

    return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值