java delegate是什么,讓我們一起了解一下?
delegate是一種設(shè)計(jì)模式,即一個(gè)對(duì)象不能完成的事情,委托另一個(gè)對(duì)象幫其完成,delegate定義代理為屬性時(shí),使用weak修飾,避免造成對(duì)象的循環(huán)引用,引起內(nèi)存泄露。
如何在java中定義delegate代理?
在java中定義delegate代理需要進(jìn)行實(shí)現(xiàn)的方式。代碼示例如下:
-?(void)orderTickerForMe { ?????????NSLog(@"叫人幫我訂票"); ????????? ?????????if?(self.tickerDelegate?&&?[self.tickerDelegate?respondsToSelector:@selector(orderTicker)]) ?????????{ ?????????????[self.tickerDelegate?orderTicker]; ?????????} }
-?(void)getTickerForMe { ?????????NSLog(@"叫人幫我取票"); ????????? ?????????if?(self.tickerDelegate?&&?[self.tickerDelegate?respondsToSelector:@selector(getTicker)]) ?????????{ ?????????????[self.tickerDelegate?getTicker]; ?????????} }
那我們?cè)谑褂脮r(shí)應(yīng)該注意什么?
1、導(dǎo)入該對(duì)象的頭文件。
2、實(shí)例化該對(duì)象。
3、設(shè)置該對(duì)象的代理。
4、添加該對(duì)象的協(xié)議。
5、實(shí)現(xiàn)該對(duì)象的代理方法。
實(shí)戰(zhàn)操作:
因?yàn)樵趈ava中就沒有delegate這個(gè)字段了,所以要實(shí)現(xiàn),不過也不是很復(fù)雜。
1、首先定義一個(gè)interface
//?觀察者 public?interface?IConnectEventObserver { //?接受到一個(gè)包 public?void?OnRecvANetworkPacket(ConnectPacket?packet); }
2、然后定義一個(gè)虛類,在里面定義通知對(duì)象。
//?通知者 public?abstract?class?ConnectEventINotifier?{ protected?ArrayList?observerList?=?new?ArrayList(); /** *?新增一個(gè)observer *?@param?observer?添加的觀察者 *?@return?是否添加成功/新添加 */ public?boolean?AddObserver(IConnectEventObserver?observer){ if(observer?==?null) { throw?new?NullPointerException(); } if(?observerList.indexOf(observer)>=?0){ //?重復(fù)添加觀察者 return?false; } observerList.add(observer); return?true; } /** *?刪除一個(gè)observerList *?@param?observer *?@return?是否刪除成功,如果失敗,代表這個(gè)觀察者并沒有注冊(cè) */ public?boolean?RemoveObserver(IConnectEventObserver?observer){ if(observer?==?null){ throw?new?NullPointerException(); } int?observerIndex?=?observerList.indexOf(observer); if(?observerIndex>=?0){ observerList.remove(observerIndex); return?true; } return?false; } /** *?通知所有觀察者 *?@param?packet *?@return */ protected?boolean?NotifyAllObserver(ConnectPacket?packet){ for(IConnectEventObserver?observer?:?observerList)?{ observer.OnRecvANetworkPacket(packet); } return?true; } }
以上就是小編今天的分享了,希望可以幫助到大家。