从C++到objective-c----委托(模板方法)


上篇中,简单介绍了委托如何实现,Core Location框架中,委托与协议共同使用,实现了对象间解耦及灵活性的问题,现在在上一份代码的基础上,新增加一个协议,即ManagerDelegate,此协议只有一个方法decideFrameDescription,这就构成了一个委托机制(delegation)(设计模式的一种)。

代码(点击这里下载)

//环境

//Mac OS X 10.3.7

//Xcode Version 4.3.2 (4E2002)  为了IOS 5.1 升级了新版本的xcode

//代码中NSObject *可以用id类型替换

#import <Foundation/Foundation.h>
@protocol ManagerDelegate <NSObject> //协议
- (BOOL) decideFrameDescription;
@end

通过Delegate实现此协议,即

@interface Delegate : NSObject<ManagerDelegate>//绑定MangerDelegate
@property NSInteger number;
-(id)init;
@end
#pragma mark-
#pragma mark ManagerDelgate
//实现协议
-(BOOL) decideFrameDescription{
    return NO;
    //通过return YES 或者 NO,来控制框架的描述
}
@end
最终框架会在根据用户在Delegate中协议的描述,完成框架里相应方法的变化,在本例中是

@implementation MyFrameWork
@synthesize delegate,decide;
- (NSString *) description{
    if([self.decide decideFrameDescription]){
        return (@"I am a MyFrameWork");
    }
    else{
        return (@"I am a decided MyFrameWork");
    }
}
在框架中需声明协议接受的对象类型,如下

@protocol ManagerDelegate; //对协议声明的引用
@interface MyFrameWork : NSObject{
}
@property (nonatomic,assign)NSObject   *delegate;//委托对象的指针,类型为NSObject,即一切objective-c类的父类
@property (nonatomic,assign)id<ManagerDelegate> decide;//声明需要接受实现了ManagerDelegate协议的对象
- (id)init;
- (void) callDelegate;
@end
最终,我们通过在Delegate中实现ManagerDelegate协议,而框架通过decideFrameDescription的返回值,实现了改变。像在 Cocoa touch框架中,如果我们要使用一个picker(选取器),但框架不知道我们要的是几个组件的picker和每个组件的内容,所以需要在我们的ViewControler中实现<UIPickerViewDelegate>和<UIPickerViewDataSource>.如果在 numberOfComponentsInPickerView中返回2,完成numberOfRowsInComponent的组件选择,完成UIPickerViewDataSource协议。
运行显示效果如下图:


    <此例为其他工程截图>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值