設計模式之裝飾設計模式 二 delegate

2021-07-08 10:54:41 字數 3593 閱讀 4169

這次我為大家介紹裝飾設計模式中的delegate。

一. 

什麼是delegate

從委託方法的實現來看,委託方法的實現是在另外乙個類中完成,即委託類的內部暴露了,與我們一般堅持的隱藏實現原則相違背。

從委託類的定義可以看出,委託與協議有一定的相似性。都採用

protocol

關鍵字來宣告

,並且其中的方法都有

optional

和required

,都需要對

required

方法和呼叫的

optional

方法進行實現。而不同的是在委託物件所在的類中需要定義乙個

delegate

物件,並且為

id型別。

二. delegate

的用途

但是delegateprotocol沒有關係。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 即模板模式 核心思想 產品不變的部分首先實現,將易變的部分抽象出來供子類完成。例如 一雙運動鞋大體製作流程各廠家基本一致,但是各環節實現細節可有些不一樣,不一樣的部分抽象出來讓不同廠家實現。即先有個框架,細節交給不同廠家實現 程式設計例項 趙本山小品中提到的將大象裝...