這次我為大家介紹裝飾設計模式中的delegate。
一.
什麼是delegate
從委託方法的實現來看,委託方法的實現是在另外乙個類中完成,即委託類的內部暴露了,與我們一般堅持的隱藏實現原則相違背。
從委託類的定義可以看出,委託與協議有一定的相似性。都採用
protocol
關鍵字來宣告
,並且其中的方法都有
optional
和required
,都需要對
required
方法和呼叫的
optional
方法進行實現。而不同的是在委託物件所在的類中需要定義乙個
delegate
物件,並且為
id型別。
二. delegate
的用途
但是delegate與protocol沒有關係。delegate本身應該稱為一種設計模式,是把乙個類自己需要做的一部分事情,讓另乙個類(也可以就是自己本身)來完成,而實際做事的類為delegate。而protocol是一種語法,它的主要目標是提供介面給遵守協議的類使用,而這種方式提供了乙個很方便的、實現delegate模式的機會。
為什麼需要協議?
指出三個原因:
to declare methods that others are expected to implement
to declare theinte***ceto an object while concealing its class
to capture similarities among classes that are not hierarchically related
通常,乙個delegate的使用過程,需要經過五步:
1. 建立乙個 delegate;
2. 委託者宣告乙個delegate;
3. 委託者呼叫delegate內的方法(method);
4. 被委託者設定delegate,以便被委託者呼叫;
5. 被委託者實現delegate 所定義的方法。
給出栗子,程式猿學習路上的拙劣使用:
這是鄙人在網路請求時返回資料使用的delegate, 目的是為了在另乙個類中完成實現,得到請求的資料;
@protocol urlprotocol @required
- (void)returnarray:(nsdictionary *)data;
@end
@property (nonatomic, retain)iddelegate;
接著:
- (void)connectiondidfinishloading:(nsurlconnection *)connection
- (void) returnarray:(nsdictionary *)data
得到從網路請求的資料,並在controller中成功呼叫。
給出我的網路請求部分**:
//
// myrequest.h
// getnet
//// created by macbook on 15/10/15.
//#import #import "thirdviewcontroller.h"
@protocol urlprotocol @required
- (void)returnarray:(nsdictionary *)data;
@end
@inte***ce myrequest : nsmutableurlrequest @property (nonatomic,retain) nsmutabledata *responsedata;
@property (nonatomic,retain) nsurlconnection *connection;
@property (nonatomic, retain)iddelegate;
@property (nonatomic,retain) nsdictionary *data;
@property (nonatomic,retain) nsstring *citystring;
//@property (nonatomic,retain) nsmutablearray
//開始非同步請求
- (void)startasynrc;
//取消非同步請求
- (void)cancel;
返回資料
//- (void)returnarray:(nsdictionary *)data;
@end
以及:
//
// myrequest.m
// getnet
//// created by macbook on 15/10/15.
//#import "myrequest.h"
#import "viewcontroller.h"
@implementation myrequest
#pragma mark- nsurlconnectiondatadelegate**方法
//開始非同步請求
- (void)startasynrc
//取消非同步請求
- (void)cancel
#pragma mark - nsurlconnection delegate
//當接受到伺服器的響應(聯通了伺服器時會呼叫)
- (void)connection:(nsurlconnection *)connection didreceiveresponse:(nsurlresponse *)response
//當接受到伺服器的資料時會呼叫 (可能多次呼叫 每次傳遞部分資料)
- (void)connection:(nsurlconnection *)connection didreceivedata:(nsdata *)data
- (void)connectiondidfinishloading:(nsurlconnection *)connection
- (void)connection:(nsurlconnection *)connection didfailwitherror:(nserror *)error
@end
如果你對本篇部落格有任何疑問,隨時提出。
王亦梁
設計模式之裝飾設計模式
1.目的 動態擴充套件類的行為 開閉原則 對擴充套件開放,對修改關閉 2.要點 裝飾類和被裝飾類都實現同乙個介面或者繼承同乙個類 3.具體實現 被裝飾元件介面 被裝飾元件實現類實現 抽象類構建被裝飾元件實現被裝飾元件介面 裝飾類繼承抽象類 裝飾類 重寫抽象類方法 裝飾 4.例項 被裝飾類介面 pub...
設計模式之裝飾模式
有時如果需要對某乙個類增加乙個功能,可以使用繼承來實現。但是如果想要只是對某乙個物件來增加一項功能,則可能會用到裝飾模式。裝飾模式的主要作用是動態的給某乙個物件新增某些功能。如果此時使用繼承來新增功能時,會產生大量的子類,導致難以維護。裝飾模式的簡要類圖如下 其中 component為待增加功能 即...
設計模式之裝飾模式
template pattern 即模板模式 核心思想 產品不變的部分首先實現,將易變的部分抽象出來供子類完成。例如 一雙運動鞋大體製作流程各廠家基本一致,但是各環節實現細節可有些不一樣,不一樣的部分抽象出來讓不同廠家實現。即先有個框架,細節交給不同廠家實現 程式設計例項 趙本山小品中提到的將大象裝...