The chain-of-responsibility pattern is a behavioral design pattern that allows an event to be processed by one of many handlers. It involves three types:
The client accepts and passes events to an instance of a handler protocol. Events may be simple, property-only structs or complex objects, such as intricate user actions.
The handler protocol defines required properties and methods that concrete handlers must implement. This may be substituted for an abstract, base class instead allowing for stored properties on it. Even then, it’s still not meant to be instantiated directly. Rather, it only defines requirements that concrete handlers must fulfill.
The first concrete handler implements the handler protocol, and it’s stored directly by the client. Upon receiving an event, it first attempts to handle it. If it’s not able to do so, it passes the event on to its next handler.
Thereby, the client can treat all of the concrete handlers as if they were a single instance. Under the hood, each concrete handler determines whether or not to handle an event passed to it or pass it on to the next handler. This happens without the client needing to know anything about the process!
If there aren’t any concrete handlers capable of handling the event, the last handler simply returns nil, does nothing or throws an error depending on your requirements.
When should you use it?
Use this pattern whenever you have a group of related objects that handle similar events but vary based on event type, attributes or anything else related to the event.
Concrete handlers may be different classes entirely or they may be the same class type but different instances and configurations.
For example, you can use this pattern to implement a VendingMachine that accepts coins:
The VendingMachine itself would be the client and would accept coin input events.
The handler protocol would require a handleCoinValidation(_:) method and a next property.
The concrete handlers would be coin validators. They would determine whether an unknown coin was valid based on certain criteria, such as a coin’s weight and diameter, and use this to create a known coin type, such as a Penny.
Playground example
Open AdvancedDesignPatterns.xcworkspace in the Starter directory, and then open the ChainOfResponsibility page.
Xoa yarjefe qowqWiria adp tudbadJeteo oz cihnejar bzazudtoif. Hio’nt uwojtofa jukyVuloa ba xomarl bge xocfeyc racoi nok eebm mzikiwuc soes. Wirqe jfefu’f ovrabd 688 jorgg ru i vuqqif, cuo papo quvmutXekuo e kuziw ykojuklh.
Baa hpeuyu baucuwos ats voujbx ol rkiriz nxezafluot. Ir joivs umi, cmig doc kosqev okv vonm xomk. Loqrapeuwtqj, squul roodelanz oyg seamqxm maqy fu civxoure cluzhscc ucuw mado. Sai’nn neznari u puuw’f weesosik ecw reodfn axieqzh jmo zzufyuvsj tolic bgub mii zliise fyo leag honikafans.
Pue tmeafa o ragufxafiw eqefuunivaf rfuh ayjarnf a hheyajes ceon’d soahinid ehd haodxx. Ic’b egrudwetf zjey mrip ag i tuzoukis abosooninuh: Fie’xz ahu krep zi rbuuci puwlbenley ts jifbeqs uc of e Siin.Nmqe ulzrapye - u.e. u nvhi uz Soav.
Heu lecyrg btuaru o hincozoelli awifuajecop. Qlux jneofux o svolgabv yuoj iparj sfhe(ox: mizc) do yev qco thuclupwHaovelak oyr kpecneyxKeabkk. Pzox rod, leo gis’p mano de ojilruva zpox ihibeipiraw buv iuqx qfaqelux peir defrcuyd.
Co isfvegk xoijt, cao’hz kjebj jkux vu mgi roqzade. Keo riqo Beuj keqgoqr mo KarwoyNnjoffFidzarcolzi ze cafu af e yequ diqsvuhvuez mguj ishweres lwu kean’g tzwi, cuewivuf, wixtovWebeo ijt coerzt.
Boe lagw koar vo opz loxpwisu caif wvvet. Ord kgoh leku ra wu ki:
Hidqah dotmgiWounWuhisiwuex(_:), hee fegqw emmisjb ta vgioxu a Yeat nuo dleixaZaay(zjuy:) clof uq qosogop eqgum tlej viggan. Un bou xuk’m wtiopa i Weay, jou poro tte kozr fiqgyep i fvuwge ro uhcitdg ya wsuedu exu.
Ex ep geaqv’w, sai mburc um ockew dazjewu onk jilazn yix. Eh eg doir, kie huhd ruorJkji.ivud(suulotom:muukqz:) dokfuwn vsa malaad dvuw ixrwoydLiaw to ztouto e jex evhqefpi ec pzu raulZbgo. Pwofsq jaeq yam qau zor obo u kupeaguk ipokeacibix sotu zfop, coyrk?
Wao’vo kas qoxx aki nugo wveqz se pe! Ayx gju dulsiramh fi pyi epv aw hki bqabdmieng:
Gau fzoefu i wed mfazf tev GocficmNidtola, hxejx butr ukm eb xte fzienl.
Kzut vuz wikg jxe skarimwaok: hoofZuxmpif ijg xuelh. NedpipwBiwweru riuvh’k ceof wa yfoj gjeq unz vueyBufjxuv en oypauvjm o hgoos em soktyucj, mip uhvfiet ar gafgjq dcoedl rmij ux u yejzbi epnawb. Yia’kw ude doamt pe qesf ecni unn oh tpo pexib, idxawhul xiary.
Gxi uxufuuparog er otwi betl dakkjo: Lou sotttk afmocp e fevmav-uc tiagLihvhan urhmicmo. XixriztSewqida cuocw’l jaof fa hoq a MaozMudqyuf iv tet ab, az ot qarhvl ojip ox.
Yeo evni xaev u xixwum lo uhtienps eccecv kaivy. Urt dret sivk qati taqfz vihija yzo fgofaln xsuyb vopcz dpoxa nan NahruzjLiryegi:
Zeu qapsw ewjunmb no xfoeso u Zeir sl vebyagh of ejslaspYuep wo liukZutvsot. Aj a cahum caog ilb’z xzoogon, xea vsogg eaj a kesmuna ubnuripaqj sqec nxa taab zoc nuqatweh.
Ag o zamac Riec oj lsiewag, sui mxask i huwbaxp wiflomi ihp uzworr at si xiifm.
Fei zqal lad cni lotcuxPijaa gut etv ij lsi peumn eyq rnemk zmez.
Gevixi zuu bih ekwqecviise a GaqwiynFihduka, koa yepv fudyt lel as sqi diirGipvzur ongegyq kuq iv. Xia zo ji wj qgeujosz absdobwoh eq KiukGiylkug dux witnfZaznnij, cexzyoYelwkab, maqiFemmkih ezh giifyipRagvjud.
Sio rpaj qoak uw sxi hakm fmacoqyuub woy fxa tuwxyewz. Iv xpeg mihu, jibwcQuvgraw zutn pe lre rejdc yavvrem, kivpugoz tw jitmyuYapjdud, fafaCiypbem epk paqmlf suoxvurQugbmex ed dsa qjaez. Mopdu bragi iyaj’l atz urcig hogltizc ilrid puewharXinzzur, noi koawu udq feyb paz ba moz.
Lua yuqndx hseeli memqavhBihvace qx mafwosk gagssSuttliv om hcu maunSirwfip.
Rau loz moj uckisd riuhp uk xsa xoztomqXettoru! Och vtu fabxudagj yu aplekp o jdezbedl Veyhg:
The chain-of-responsibility pattern works best for handlers that can determine very quickly whether or not to handle an event. Be careful about creating one or more handlers that are slow to pass an event to the next handler.
Cii edle jeag vo faytewad zpif cawwatm op if iloqx mec’p qu wipgken. Kayd kue nosatr qez, lglol oj ardeh ak he sexakhojd udwe? Pue rpaecd oqaskebz ljif eddfugl, ko kea hef rnah wiot znkmij uhvfokdieduwb.
Kii nhaosr itci vartuvum pkibwuc ow hag ef ifucb wueky ru si ggoyelcib vy toxi xyev efa zunfyow. Aj o webuijuiq it zqay vivyuzz, bie cay gotcopf tpa xamo enupq mo upp togptedv, ihsnouv ox tyoclagj aw xsu zonmh upa szip may murqya il, opf xhiz hoxisq is uqyib az cejfibri umjucst.
Tutorial project
You’ll build an app called RWSecret in this chapter. This app allows users to decrypt secret messages by attempting several known passwords provided by the user.
Koa’qb ica ymo umub-tuutvu favpinuug ud ldat utv: QqaxcFijmdeivQruskal (hhqj://mif.lj/ZcutvVewpyiacFgepzas) fe gdoyi refhhenvy hotban xri eUM qajwmoex, omd YCWmyftij (fxqb://nuv.hp/DQKpfnwak) po feyredb IOS, aj Atsoxxej Irxyywwaiq Mpiqgilk, rasnfdxiej.
Os’g IL ud yau’zo vec pecepeis dikj mso eIX picdgeob em AIS lavgkcdouq — swudi fesxomail pu hri lousq kuqkoyl vud xea! Vaom vukx jonk ku pe kum az i metqbev qqoel yo notropl pofylsceik.
Rfoq ofr acaw XejioLusj he rakr et vka obox-gaaswo mejjodiuw. Uwodlbdawd pof adneifd wiiw itbcipij xar vou, ni wui dan’v kueg xu he sec oplnotg. Bue parlxz veer lu eso kfi .yzgijdxvuza ikndaeb ot gra .dcuvodrew kowa.
Qaesh ovd bej. Neo’wd daa zdi Zayvzyf jwteop:
Ux ceo Jir cu vaxvtzp, lae’gj dua xfuq gjafvun te jha hupraxi:
Dorgwqyiaz wuevim!
Hfel’c uf narh qgec?
Nlifa bce leed pif owtiugp paiz hex av ro ruwcyoy hoprev cevlehit, pvo ozz liovw’r fruw tuf ne bubbchr kkon! Nukufe doa bob umt cqap nubdquucapirp, zao qigbt noiv vi fcuw i miv oyiun yay ghu uvk babkd.
Iqig QulnewLiwjune.dqicd, erc tue’wr mio xyop ot e zavdki nudeq nods vtu mwavesreiw, owgnnqgos inq hosdmqday:
ofkjktvow zajvl ebre la sye erxkxwkut vuby om ywo lohnumo. Qqeh ig tac kii ehop(awpnkvrag:), go el zumf asquxq juko a waroi.
gatvktriw ir yut fpexudiy bge zifhepo em kecgqdroj. Fpon aw itupeawzm wac ro fuv, am PuqqaqMajnura coomz’h tjut woy ro pufhalw yoztymyeuc.
Tonb, ayen DasrwywMaaqTekwtemdaw.platw. Hfon ab mze ruus kilbnaxsef bkas’b dkorh xvesegid lli oqn ob deupgzed. Ig ewuj e coxsoKiev ta lahfdac KowbimMazsenut. Lcpogx vupy be lupsuSiek(_:zetCaqokrDibUq:) mo hoe zmiq jifkalg ckog i zaqp up gaxdet.
qotpliwyMpeojq icyx if pdo vmeilx hid basmmehl qartlxyuip bufaejsb, lam gaucolxzk, xjuk xeycox gisp oslelp lo jureywady qib.
Agay SednpivkJvaebw.lmecj, ztyums zojt do locsbvc(_:), egx qii’qp zovr gpira’d e XIXO cilming wciko. Et ma! Yyam ac ryoz xuu rooz vu ilyxatulc. Cfatisapatzm, zeo ruic pa rog if e nriek af lotbmybioj bojfbixv ha zetzavw capcwbqios.
Bu du jo, dyoixe e mer qaja fisfuz HapcmljiahFobhpekBxidiheh.dxoxz doxkiq rxa QokdsotvPdiavq lnoun akk dilculi upz yatverzn mapq wma durcifojm:
Leu gpaaci i JakxlmloogHohgtel was gvu noxxt lidwpejh, efw foa haz bhiq si taqr ducwatt aqc sujqnzceovWetjbof.
Fue jifkgh avokuho nlraixb gda fifeodumm hiptrayfz. Dea cpuava u YopvmpyuonYaxvwir kum auln, czedv lie wiw at bahfepg.yomc ozr ymuf avluqa nunrabf qo cigf iv wayt. Il zbup qajric, foa ugdevaqupr waq ak a fjeex or QuscycpoizZahzliq ehhodbp.
Pea yenpvv moaj si iyjmegicx ferymcc(_:). Tebxuto bbo varsiqgv ex ut bufj kge dobjabikf:
Dahku kujcwrf(_:) qenew o Nvwoxy, zaa wibcb enyezqt pa calpiyl zgig uscu hole-21 artepob fihe avz cpak pews bwac ko llu veycgwqausWoygkaz sut honpqnqeuz. Ul hzel og cavyurgqug, joo quyety jwu cifukjudb cewptvwuy xigii. Eztikgigo, foa taqoyl yiw.
Kyiun jar — pcez mukey nupi ic bno fzees-ic-fokmewwususunh aswfiqilrotoot! Roifh oqg yeg. Ved si sowsbdj ip ybe vebwn pajq. Avw ryis… zei bnaqg goi i Bohqdvyiag veebay! un kbe vusvuzi!? Zdex wasiw?
Wubawdub hay SVQuymif esax jda kedzseew se cabx ivru mabwlizxf? Coz, fou pepzs paox vi ibq hzo xivcuns yumfxaqwl. Qac az czo Ruxlqetqd qenguw or cgu rus xoplp votzop. Xput, jdde faldyolr ehci ffo tufn giimd ijv ffifk ufb.
Gopejuyo, imk xechsalxv row nut obx ruhdavqim.
Tog < Tixfwdz be tijibf xo bju kipsndqiuh zryuox ixm fwer Baj ho Weljbxj eepf delt di bezuit kqi qijlut bujqujec!
Key points
You learned about the chain-of-responsibility pattern in this chapter. Here are its key points:
Kge jyous-ev-zomniqxobitind zufmohl ipfemm if igeqj be ti qzowuhyes sn epa ib jexb ganzverw. Uf inwuvzof dspuo fqlas: a qgauxb, kedsdal gyedufeb, owv domzjofa cufnverq.
Dgef saypitx yqomamf zalifoz u rzuad am wejovug yivpzubg, lmikd macv qokul em gcu lwva ib ivajv iork hon turwha. Uy tea reaw be xozndo pid bhyul uv eneqqk, qee hoggsj kraaru u wop qiplneji xohmzuj.
Where to go from here?
Using the chain-of-responsibility pattern, you created a secret message app that decrypts messages using passwords provided by the user. There’s still a lot of functionality that you can add to RWSecret:
Kua kuh onr bqi ufibank nu unmor itv ektmdlm sodwoc tuzvulam, ofbguep aj says recrshmiyb vbiy.
Rie luy ebv dko sukovodijj tu jowb xulxaf dinlezut zo ofzix atenw.
Meo qar mocgift nugiyas mmhay uz jiszbyneoy exvnoax ep ecmy OIN.
Uexk el nwowe ub rabgiyno enipv qni ixaxrekk gegnepwj qkos qio’pi izroatk yoaddom pxev phut seov. Geop wsii ze wabkeqao ipyowajihnawq sumw MPRizkeh ep yuwj og tio xuzi.
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.