亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS應用設計模式開發中職責鏈(責任鏈)模式的實現解析

2020-07-26 03:23:58
字體:
來源:轉載
供稿:網友

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

原理結構

2016330173610369.png (504×398)

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

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

下面給出類結構圖。

2016330173647539.jpg (500×291)

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

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

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

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

Handlers類接口

復制代碼 代碼如下:

#import <Foundation/Foundation.h>

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


Handlers類實現
復制代碼 代碼如下:

#import "Handlers.h"

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


ConcreteHandler1類接口
復制代碼 代碼如下:

#import "Handlers.h"

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

#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類接口
復制代碼 代碼如下:

#import "Handlers.h"

@interface ConcreteHandler2 :Handlers
@end


ConcreteHandler2類實現
復制代碼 代碼如下:

#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類接口
復制代碼 代碼如下:

#import "Handlers.h"

@interface ConcreteHandler3 :Handlers
@end


ConcreteHandler3類實現
復制代碼 代碼如下:

#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方法調用
復制代碼 代碼如下:

#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;
}


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

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

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲成人999| 国产亚洲精品va在线观看| 日韩av在线一区| 欧美激情免费看| 日韩高清有码在线| 亚洲欧美日韩中文在线制服| 精品国产91久久久久久老师| 精品美女国产在线| 日韩精品极品在线观看播放免费视频| 亚洲欧美日韩国产成人| 欧美夜福利tv在线| 日本伊人精品一区二区三区介绍| 欧美在线视频一区二区| 亚洲国产又黄又爽女人高潮的| 亚洲国产毛片完整版| 日韩欧美国产黄色| 少妇高潮久久77777| 国产欧美一区二区三区久久人妖| 在线观看日韩视频| 欧美性xxxxxxx| 中文字幕av一区中文字幕天堂| 日韩电影网在线| 日韩综合中文字幕| 色噜噜亚洲精品中文字幕| 日韩精品视频免费| 日韩精品久久久久久福利| 亚洲a成v人在线观看| 成人亲热视频网站| 亚洲女同精品视频| 欧洲美女7788成人免费视频| 亚洲精品电影在线观看| 欧美在线影院在线视频| 91精品国产91久久久久久不卡| 欧美在线视频免费| 亚洲欧美综合精品久久成人| 高清欧美一区二区三区| 91在线观看免费| 国产视频精品va久久久久久| 91久久精品美女| 一区二区亚洲欧洲国产日韩| 久久久999国产精品| 8090理伦午夜在线电影| 亚洲欧美日本精品| 久久精品国产久精国产思思| 日产精品久久久一区二区福利| 色偷偷偷综合中文字幕;dd| 成人免费视频网| 奇米影视亚洲狠狠色| 久久视频免费在线播放| 久久全国免费视频| 中文国产成人精品久久一| 日本精品va在线观看| 色狠狠av一区二区三区香蕉蜜桃| 亚洲色图国产精品| 色偷偷av亚洲男人的天堂| 亚洲天堂男人天堂| 国产精品国产三级国产专播精品人| 亚洲免费视频网站| 日韩一区av在线| 国产在线视频不卡| 91精品久久久久久久久中文字幕| 国模吧一区二区三区| 亚洲国产精品成人va在线观看| 在线观看国产精品日韩av| 国产精品视频久久| 综合欧美国产视频二区| 国产精品午夜视频| 日韩欧美在线国产| www国产精品com| 久久久精品日本| 欧美性在线视频| 久久99久久99精品中文字幕| 国产精品自产拍在线观看中文| 91在线视频一区| 亚洲少妇中文在线| 久久伊人91精品综合网站| 国产亚洲精品成人av久久ww| 亚洲第一在线视频| 亚洲人成网站777色婷婷| 国产精品视频色| 国产成人精品免高潮费视频| 国产日韩中文字幕在线| 欧美乱大交做爰xxxⅹ性3| 欧美影院在线播放| 浅井舞香一区二区| 国产成人精品免费视频| 在线播放国产一区中文字幕剧情欧美| 久久精品国产v日韩v亚洲| 亚洲一区二区久久久久久久| 啊v视频在线一区二区三区| 中文在线资源观看视频网站免费不卡| 久久久国产精品视频| 欧美猛少妇色xxxxx| 亚洲国产成人精品电影| 日韩欧美亚洲成人| 国产成人精品久久亚洲高清不卡| 亚洲一区二区三区视频| 亚洲欧美色图片| 欧美日韩成人在线视频| 国产成人精品久久二区二区| 亚洲国产精品人人爽夜夜爽| 亚洲精品电影网| 国产精品96久久久久久又黄又硬| 精品久久久久久亚洲国产300| 中文字幕日韩av综合精品| 国产美女久久精品香蕉69| 久久av在线播放| 456国产精品| 久久久极品av| 国产黑人绿帽在线第一区| 日本成人精品在线| 亚洲精品美女久久久| 国产精品久久久久久久9999| 国产日韩欧美91| 91欧美精品成人综合在线观看| 久久精品国产亚洲一区二区| 日韩资源在线观看| 热re99久久精品国产66热| 久久精品中文字幕一区| 欧美电影免费观看高清完整| 亚洲欧美激情一区| 亚洲国产精品悠悠久久琪琪| 亚洲男人的天堂网站| 91精品视频在线免费观看| 日韩网站免费观看高清| 亚洲精品久久久久久久久久久| 另类少妇人与禽zozz0性伦| 国产福利视频一区| 伦理中文字幕亚洲| 97视频国产在线| 欧美一区二区三区图| 国产一区二区三区在线看| 成人免费xxxxx在线观看| 成人精品一区二区三区电影黑人| 日韩电影中文字幕在线观看| 在线丨暗呦小u女国产精品| 亚洲天堂第一页| 亚洲高清不卡av| 91精品国产99| 国产精品免费在线免费| 久久天天躁夜夜躁狠狠躁2022| 国产成人精品优优av| 欧美成人精品激情在线观看| 国产精品亚洲激情| 91久久久久久久久久久久久| 亚洲电影免费观看| 日本欧美爱爱爱| 亚洲欧美资源在线| 97超级碰碰碰| 一区二区三区视频在线| 久久久噜噜噜久噜久久| 国产精品成人av性教育| 亚洲精品日韩欧美| 国产精品福利在线观看| 中文字幕久精品免费视频| 日韩在线视频国产| 国产精品爽黄69天堂a| 日韩精品在线免费播放| 国内精品久久久久伊人av| 亚洲一区二区免费| 国产一区二中文字幕在线看| 日韩亚洲欧美中文高清在线| 国产精品偷伦视频免费观看国产| 国产小视频91|