最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

iOS應(yīng)用設(shè)計模式開發(fā)中職責鏈(責任鏈)模式的實現(xiàn)解析

 更新時間:2016年03月30日 17:39:48   作者:arbboter  
這篇文章主要介紹了iOS應(yīng)用設(shè)計模式開發(fā)中職責鏈模式的相關(guān)實現(xiàn)解析,示例代碼為傳統(tǒng)的Objective-C,需要的朋友可以參考下

定義
為了避免請求發(fā)送者與接收者耦合在一起,讓多個對象都有可能接收請求,將這些對象連接成一條鏈,并且沿著這條鏈傳遞請求,直到有對象處理它為止,職責鏈模式又稱為責任鏈模式,它是一種對象行為型模式。(如果你接觸過異常處理,那么套用異常處理機制可以更好地理解)。
職責鏈可以是一條直線,也可以是一個環(huán),還可以是一個樹形結(jié)構(gòu),不過最常見的職責鏈是直線型,即沿著一條單向的鏈來傳遞請求。鏈上的每一個對象都是請求處理者,職責鏈模式可以將請求的處理者組織成一條鏈,并使請求沿著鏈傳遞,由鏈上的處理者對請求進行相應(yīng)的處理,而客戶端無須關(guān)心請求的處理細節(jié)以及請求的傳遞,只需將請求發(fā)送到鏈上即可,通過這種方法將請求的發(fā)送者和請求的處理者解耦,消除兩個角色間的依賴關(guān)系,可以自由地組合。

原理結(jié)構(gòu)

2016330173610369.png (504×398)

上圖闡釋的是職責連模式的實現(xiàn)原理,主要角色包括:
Handler:抽象處理者。定義出一個處理請求的接口。如果需要,接口可以定義出一個方法,以設(shè)定和返回對下家的引用。這個角色通常由一個抽象類或接口實現(xiàn)。
ConcreteHandler: 具體處理者。具體處理者接到請求后,可以選擇將請求處理掉,或者將請求傳給下家。由于具體處理者持有對下家的引用,因此,如果需要,具體處理者可以訪問下家。
Client:客戶端
handleRequest:抽象處理者的公用接口,要求每個鏈式節(jié)點都實現(xiàn)這個接口,能夠處理客戶端發(fā)過來的請求數(shù)據(jù)。
對于每個鏈式節(jié)點,需要滿足一下兩個條件:
實現(xiàn)抽象處理者(Handler)所定義的抽象接口,能夠識別接收的請求;
有一個successor,用于把當前不能處理的請求轉(zhuǎn)發(fā)傳遞到下一個節(jié)點,如此才能形成一個鏈。(successor是指下一個ConcreteHandler的引用,相當于鏈表里面的next指針)
由于通過上述的編程設(shè)計,使得請求和處理該請求的對象完全沒有依賴關(guān)系,因為客戶端甚至不知道是誰處理了這個請求,這樣的話,使得整個鏈式結(jié)構(gòu)很靈活,可以隨時添加新的的節(jié)點,當然也支持隨意調(diào)節(jié)節(jié)點順序、刪除不必要的節(jié)點等等操作。

iOS實現(xiàn)
職責鏈模式的一個很重要的特點是,當客戶發(fā)出請求之后,客戶端并不知道哪一個對象最終處理這個請求,這樣系統(tǒng)的更改可以在不影響客戶端的情況下動態(tài)地重新組織和分配責任。

下面給出類結(jié)構(gòu)圖。

2016330173647539.jpg (500×291)

從上圖可以看出,當客戶提交一個請求時,請求是沿鏈傳遞直至有一個ConcreteHandler對象負責處理它。這樣做的好處是請求者不用管哪個對象來處理,反正最終是要被某一個對象處理就是了。也就是說接收者和發(fā)送者都沒有對方的明確信息,且鏈中的對象自己也不知道鏈的結(jié)構(gòu)。結(jié)果是職責鏈可簡化對象的相互連接,它們僅需保持一個指向其后繼者的引用,而不需保持它所有的候選接受者的引用。

這些特點的好處是我們可以隨時增加或修改處理一個請求的結(jié)構(gòu)。增強了給對象指派職責的靈活性。但是,一個請求極有可能到了鏈的末端都得不到處理,或者因為沒有正確配置而得不到處理,所以這更需要我們事先考慮全面。

好的,說了這么多,還是老樣子,給大家展示一下簡單的示意代碼。

注意:本文所有代碼均在ARC環(huán)境下編譯通過。

Handlers類接口

復(fù)制代碼 代碼如下:

#import <Foundation/Foundation.h>

@interface Handlers :NSObject{
    Handlers *mySuccessor;
}
-(void)SetSuccessor:(Handlers*)successor;
-(void)HandleRequest:(int)request;
@end


Handlers類實現(xiàn)
復(fù)制代碼 代碼如下:

#import "Handlers.h"

@implementation Handlers
-(void)SetSuccessor:(Handlers *)successor{
    mySuccessor = successor;
}
-(void)HandleRequest:(int)request{
    return;
}
@end


ConcreteHandler1類接口
復(fù)制代碼 代碼如下:

#import "Handlers.h"

@interface ConcreteHandler1:Handlers
-(void)HandleRequest:(int)request;
@end
ConcreteHandler1類實現(xiàn)

#import "ConcreteHandler1.h"

@implementation ConcreteHandler1
-(void)HandleRequest:(int)request{
    if (request >=0 && request <10) {
        NSLog(@"ConcreteHandler1處理%d", request);
    }
    else if (mySuccessor !=nil) {
            [mySuccessor HandleRequest:request];
    }
}
@end


ConcreteHandler2類接口
復(fù)制代碼 代碼如下:

#import "Handlers.h"

@interface ConcreteHandler2 :Handlers
@end


ConcreteHandler2類實現(xiàn)
復(fù)制代碼 代碼如下:

#import "ConcreteHandler2.h"

@implementation ConcreteHandler2
-(void)HandleRequest:(int)request{
    if (request >=10 && request <20) {
        NSLog(@"ConcreteHandler2處理%d", request);
    }
    else if(mySuccessor !=nil) {
        [mySuccessor HandleRequest:request];
    }
}
@end


ConcreteHandler3類接口
復(fù)制代碼 代碼如下:

#import "Handlers.h"

@interface ConcreteHandler3 :Handlers
@end


ConcreteHandler3類實現(xiàn)
復(fù)制代碼 代碼如下:

#import "ConcreteHandler3.h"

@implementation ConcreteHandler3
-(void)HandleRequest:(int)request{
    if (request >=20 && request <30) {
        NSLog(@"ConcreteHandler3處理%d", request);
    }
    else if (mySuccessor !=nil) {
        [mySuccessor HandleRequest:request];
    }
}
@end


Main方法調(diào)用
復(fù)制代碼 代碼如下:

#import <Foundation/Foundation.h>

int main(int argc,const char * argv[])
{
    @autoreleasepool{
        Handlers *h1 = [[ConcreteHandler1 alloc]init];
        Handlers *h2 = [[ConcreteHandler2 alloc]init];
        Handlers *h3 = [[ConcreteHandler3 alloc]init];
        [h1 SetSuccessor:h2];
        [h2 SetSuccessor:h3];
        int requests[] = {2,5,14,22,18,3,27,20};
        for (int i =0; i <8; i++) {
            [h1 HandleRequest:requests[i]];
        }
    }
    return 0;
}


好啦,代碼展示完畢!收工!

小結(jié)
行為型模式是對在不同的對象之間劃分責任和算法的抽象化,行為型模式不僅僅關(guān)注類和對象的結(jié)構(gòu),而且重點關(guān)注它們之間的相互作用。通過行為型模式,可以更加清晰地劃分類與對象的職責,并研究系統(tǒng)在運行時實例對象之間的交互。行為型模式可以分為類行為型模式和對象行為型模式兩種。職責鏈模式可以避免請求發(fā)送者與接收者耦合在一起,讓多個對象都有可能接收請求,將這些對象連接成一條鏈,并且沿著這條鏈傳遞請求,直到有對象處理它為止,它是一種對象行為型模式。
在我們?nèi)粘J褂弥?,我們或許直接接觸這方面的機會不多,但是,如果你認真有研究過程序的一場處理機制,那么你就能夠發(fā)現(xiàn)這種處理機制正是采用職責鏈的方式處理程序中拋出的異常錯誤的。
在職責鏈模式里,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發(fā)出這個請求的客戶端并不知道鏈上的哪一個對象最終處理這個請求,這使得系統(tǒng)可以在不影響客戶端的情況下動態(tài)地重新組織鏈和分配責任。
職責鏈模式的主要優(yōu)點在于可以降低系統(tǒng)的耦合度,簡化對象的相互連接,同時增強給對象指派職責的靈活性,增加新的請求處理類也很方便;其主要缺點在于不能保證請求一定被接收,且對于比較長的職責鏈,請求的處理可能涉及到多個處理對象,系統(tǒng)性能將受到一定影響,而且在進行代碼調(diào)試時不太方便。

優(yōu)點:
降低耦合度。
可簡化對象的相互連接。
增強給對象指派職責的靈活性。
增加新的請求處理類很方便。

缺點:
不能保證請求一定被接收。
系統(tǒng)性能將受到一定影響,而且在進行代碼調(diào)試時不太方便(可能會造成循環(huán)調(diào)用)。

相關(guān)文章

  • iOS開發(fā)retina屏幕下的點與像素關(guān)系詳解

    iOS開發(fā)retina屏幕下的點與像素關(guān)系詳解

    這篇文章主要為大家介紹了iOS開發(fā)retina屏幕下的點與像素關(guān)系詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • iOS UIImageView圖片自動拉伸功能

    iOS UIImageView圖片自動拉伸功能

    這篇文章主要介紹了iOS UIImageView圖片自動拉伸功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • 總結(jié)適配IOS10開發(fā)需要注意的問題

    總結(jié)適配IOS10開發(fā)需要注意的問題

    本篇文章主要介紹了適配IOS10需要注意的問題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧。
    2016-12-12
  • iOS逆向開發(fā)之微信自動添加好友功能

    iOS逆向開發(fā)之微信自動添加好友功能

    這篇文章主要介紹了iOS逆向開發(fā)之微信自動添加好友功能,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04
  • 詳解IOS圖層轉(zhuǎn)場動畫

    詳解IOS圖層轉(zhuǎn)場動畫

    這篇文章主要為大家詳細介紹了IOS圖層轉(zhuǎn)場動畫, CATransition類實現(xiàn)層的轉(zhuǎn)場動畫,能夠為層提供移出屏幕和移入屏幕的動畫效果,感興趣的小伙伴們可以參考一下
    2016-02-02
  • iOS SwiftUI 顏色漸變填充效果的實現(xiàn)

    iOS SwiftUI 顏色漸變填充效果的實現(xiàn)

    這篇文章主要介紹了iOS SwiftUI 顏色漸變填充效果的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2020-02-02
  • 開發(fā)繪圖、手勢綜合App注意點

    開發(fā)繪圖、手勢綜合App注意點

    本篇文章主要給大家詳細講述了在IOS開發(fā)繪圖、手勢綜合App容易遇到的坑以及注意事項等內(nèi)容,有興趣的朋友參考下吧。
    2018-02-02
  • 詳解iOS App中圖片的線段涂鴉功能的添加方法

    詳解iOS App中圖片的線段涂鴉功能的添加方法

    這篇文章主要介紹了如何設(shè)計iOS App中圖片的線段涂鴉功能,也就是很多應(yīng)用中圖片上傳時帶有的編輯功能的基礎(chǔ),需要的朋友可以參考下
    2016-03-03
  • iOS CAReplicatorLayer實現(xiàn)脈沖動畫效果

    iOS CAReplicatorLayer實現(xiàn)脈沖動畫效果

    這篇文章主要介紹了iOS CAReplicatorLayer實現(xiàn)脈沖動畫效果 ,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • iOS實現(xiàn)微信分享多張圖片功能

    iOS實現(xiàn)微信分享多張圖片功能

    這篇文章主要為大家詳細介紹了iOS實現(xiàn)微信分享多張圖片功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01

最新評論

抚松县| 北宁市| 姜堰市| 康马县| 南城县| 广安市| 阳东县| 会泽县| 日喀则市| 湘阴县| 西林县| 新民市| 利津县| 来安县| 平顺县| 榆树市| 师宗县| 颍上县| 商洛市| 正镶白旗| 汉源县| 和平区| 湄潭县| 永吉县| 浪卡子县| 招远市| 临漳县| 阳东县| 宁津县| 留坝县| 文化| 和政县| 南漳县| 若尔盖县| 永靖县| 镇巴县| 饶河县| 金门县| 翁牛特旗| 南安市| 荥经县|