委託代理設計模式(協議)

(網摘)

OBJC 中的 protocol 相當於 java 裏的接口,delagate 就是接口的實現類(C中的回調類似 );


數據源就是對象遵循了存儲數據的協議,可以存儲使用數據 

 

協議表示了方法可以被任何類所實現。協議本身不是類。他們只是簡單定義了一個其他對象可以實現的接口。當你的類實現了協議中的某個方法的時候也就是說你的類實現了那個協議。


Objective-C的另一個擴展稱爲協議,它非常象Java中的接口。兩者都是通過一個簡單的方法聲明列表發佈一個接口,任何類都可以選擇實現。協議中的方法通過其它類實例發送的消息來進行調用。


iPhone程序開發裏,object-c裏的delegate怎麼理解?
答:設置代理
然後就可以實現協議了。
相當於C++裏實現一個接口,或Java裏實現一個抽象類裏的抽象方法。
有些類裏不僅可以設置代理,還可以爲其設置數據源(比如一些模態窗口UIActionSheet之類的)。

有很多時候是需要在B類口中來完成一些對A類的操作, 這時就需要A設個代理讓B來完成了,這個在應用中很常見也很實用。

 

來源地址http://www.cocoachina.com/bbs/read.php?tid-26591.html

iphone開發重要基礎知識------委託代理(degegate)
委託代理(degegate),顧名思義,把某個對象要做的事情委託給別的對象去做。那麼別的對象就是這個對象的代理,代替它來打理要做的事。反映到程序中, 首先要明確一個對象的委託方是哪個對象,委託所做的內容是什麼。委託機制在很多語言中都用到的,這只是個通用的思想,網上會有很多關於這方面的介紹。
  那麼在蘋果開發過程中,用到委託的程序實現思想如下,我主要拿如何在視圖之間傳輸信息做個例子。譬如:在兩個頁面(UIIview視 圖對象)實現傳值,用委託(delegate)可以很好做到。
方法:
@interface A:UIView
id transparendValueDelegate;
@property(nomatic, retain) id transparendValueDelegate;
@end
@implemtion A
@synthesize transparendValueDelegate

-(void)Function

NSString* value = @"hello";
[transparendValueDelegate transparendValue: value];
}
@end

類B
@interface B:UIView
NSString* value;
@end
@implemtion B
-(void)transparendValue:(NSString*)fromValue
{
value = fromValue;
NSLog(@"the value is %@ ",value); 
}
@end

// 下面的設置A代理委託對象爲B
//在定義A和B類對象處:
A* a = [[A alloc] init];
B* b = [[B alloc] init];
a. transparendValueDelegate = b;//設置A代理委託對象爲B
這樣 在視圖A和B之間可以通過委託來傳值了。

下面這個例子委託有兩類:
1、一個視圖類對象的代理對象爲父視圖,子視圖用代理實 現讓父視圖顯示別的子視圖
2、同一父視圖下的一個子視圖爲另一個子視圖的代理對象,讓另一個子視圖改變自身背景色爲給定的顏色


代理,解決了C++中,動不動就要繼承等等,實現個協議就ok了。
比如mfc中,每一個程序都要繼承自CWinApp無非就是要重寫那幾個虛函數,不覺得麻煩嘛?
所以啊,在cocoa裏面,就實現個UIApplicationDelegate代理,不用繼承。只需要關心
你要捕獲的應用程序生命週期中的事件(函數)就可。 

代理就是一個引用指針,比方類a中有一個類b得指針,則b就是a得代理,a得代理就是b,那麼a幹完一件事情得時候告訴b,讓b調用對應得方法來做響應。。這就是代理

協議(Protocol)的用法和代碼例子

協議,是通過網絡,計算機使用者進行通訊後,互相進行約定規定的集合。兩個類進行通訊,用協議就比較方便。下面是 CocoaChina 版主“angellixf”爲新手寫的協議入門介紹以及代碼例子,希望對剛入門開發者有所幫助
一、說明
  1.協議聲明瞭可以被任何類實現的方法
  2.協議不是類,它是定義了一個其他對象可以實現的接口
  3.如果在某個類中實現了協議中的某個方法,也就是這個類實現了那個協議
  4.協議經常用來實現委託對象。一個委託對象是一種用來協同或者代表其他對象的特殊對象。
  5:委託,就是調用自己定義方法,別的類來實現。
  6.新特性說明
    @optional預編譯指令:表示可以選擇實現的方法
    @required預編譯指令:表示必須強制實現的方法

二、定義

.h
@protocol ContactCtrlDelegate
-(void)DismissContactsCtrl;
@end

@interface ContactsCtrl : UIViewController {
    id <ContactCtrlDelegate> delegate;
}
@property (nonatomic, assign) id <ContactCtrlDelegate> delegate;


.m
@synthesize delegate;


三、例子

例如:UITextView
@protocol UITextViewDelegate <NSObject>

@optional

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView;
- (BOOL)textViewShouldEndEditing:(UITextView *)textView;

- (void)textViewDidBeginEditing:(UITextView *)textView;
- (void)textViewDidEndEditing:(UITextView *)textView;

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text;
- (void)textViewDidChange:(UITextView *)textView;

- (void)textViewDidChangeSelection:(UITextView *)textView;

@end

  如果要調用以上這些方法,就必須設置UITextView的委託:TextView.delegate = self;


四、Demo

1、ContactsCtrl.h

#import <UIKit/UIKit.h>

//定義協議
@protocol ContactCtrlDelegate
-(void)DismissContactsCtrl;
@end


@interface ContactsCtrl : UIViewController {
    IBOutlet UINavigationBar *ContactNavBar;
    id <ContactCtrlDelegate> delegate;
}
@property (nonatomic, assign) id <ContactCtrlDelegate> delegate;


-(IBAction)canCelBtn:(id)sender;
@end


2、ContactsCtrl.m

@implementation ContactsCtrl
@synthesize delegate;

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];
    ContactNavBar.topItem.prompt = @"選取聯繫人發送短信";
}


//調用協議中的方法
-(IBAction)canCelBtn:(id)sender{
    [delegate DismissContactsCtrl];
}


3、ProtocolDemoCtrl.h

#import <UIKit/UIKit.h>
#import "ContactsCtrl.h"
@interface ProtocolDemoCtrl : UIViewController <ContactCtrlDelegate>{//添加委託
    ContactsCtrl *contactsView;
}


4、ProtocolDemoCtrl.m

#import "ProtocolDemoCtrl.h"
#define BARBUTTONADD(SELECTOR) [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:SELECTOR] autorelease];

@implementation ProtocolDemoCtrl
@synthesize contactsView;

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationItem.rightBarButtonItem = BARBUTTONADD(@selector(addContactAction:));
}


- (void)addContactAction:(id)sender{
    ContactsCtrl *contactView = [[ContactsCtrl alloc] initWithNibName:@"ContactsCtrl" bundle:nil];
    self.contactsView = contactView;
    contactsView.delegate = self;//設置委託
    [self presentModalViewController:contactsView animated:YES];
    [contactView release];    
}


//實現ContactCtrlDelegate協議中的方法
-(void)DismissContactsCtrl{
    [contactsView dismissModalViewControllerAnimated:YES];
}



具體看下Demo的實現哈,還有有時間可以看看Objective-c基礎教程2.0這本書。(新手注意)

採用某個協議 相當於給閱讀類聲明的編程人員發送一條消息,表明我們啊可以用他完成兩件事情,啥呢
1、對自身編碼和解碼
2、能夠複製自身

如果你沒定義 那你第四步的func就是自己的方法 而不是協議中的了

而且協議又沒說你必須實現方法了 你也知道協議分爲正式協議和非正式協議,正式的採用實現方法

發佈了23 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章