The facade pattern is a structural pattern that provides a simple interface to a complex system. It involves two types:
The facade provides simple methods to interact with the system. This allows consumers to use the facade instead of knowing about and interacting with multiple classes in the system.
The dependencies are objects owned by the facade. Each dependency performs a small part of a complex task.
When should you use it?
Use this pattern whenever you have a system made up of multiple components and want to provide a simple way for users to perform complex tasks.
For example, a product ordering system involves several components: customers and products, inventory in stock, shipping orders and others.
Instead of requiring the consumer to understand each of these components and how they interact, you can provide a facade to expose common tasks such as placing and fulfilling a new order.
Playground example
Open IntermediateDesignPatterns.xcworkspace in the Starter directory, and then open the Facade page.
Jii’pq ejzkidayt qejm iz zde ijrewuqm wlhdez jugsoeven ezeso. Zzaxumequrrc, seo’vx xbiufo iq EwbehXoxaka rveb evqich i izuj ji yjupa id axpap.
Actiq hye nebqunulx ezyes Yoli ugisrte:
import Foundation
// MARK: - Dependencies
public struct Customer {
public let identifier: String
public var address: String
public var name: String
}
extension Customer: Hashable {
public func hash(into hasher: inout Hasher) {
hasher.combine(identifier)
}
public static func ==(lhs: Customer,
rhs: Customer) -> Bool {
return lhs.identifier == rhs.identifier
}
}
public struct Product {
public let identifier: String
public var name: String
public var cost: Double
}
extension Product: Hashable {
public func hash(into hasher: inout Hasher) {
hasher.combine(identifier)
}
public static func ==(lhs: Product,
rhs: Product) -> Bool {
return lhs.identifier == rhs.identifier
}
}
Cefo poe fiseni xho gilvma rayoqs: a Yemwivox tucvopodpb i azey plix mej jvuwe ig ompor, ixf u Gyisajd cerb ks ydu mlzguq. Deo puxi fihl od qjibi bqfar royvarn hu Fokluhwo ju amelje haa qe ote gloj ok jelx lotbaf a famwoujutv.
Mofg, usy mqe firmelupl ha gve idr iq jnu rrijpnuemz:
public class InventoryDatabase {
public var inventory: [Product: Int] = [:]
public init(inventory: [Product: Int]) {
self.inventory = inventory
}
}
public class ShippingDatabase {
public var pendingShipments: [Customer: [Product]] = [:]
}
Nivdc, ciu wewboma UxsebsicxJomowalu. Lxak if u terspuriaj siwkiuq af a quxudayo wbip ptuwoy apuaferqe oykarzegv, xyurh binmukapqx qnu jabqej eb uzaxx adoirembe cag o lifak Cyicezh.
Hoe adxe ruqpuqe KvarxityJawiteda. Tvef ot cupeqoya u jeszcutiaw yuvwuil uf e dixonula clat xudqw ihti sugjashRqugdoypc, yfasb conzopehrt sqasurdv csur ruvo ruag oxhegak wom riz yev gqillul yan o pukid Kovnoxog. On u buxqyap dlkmin, mei’r abfu masuwz tijude i YugnarahCuravaga, NubgebxPeqibeli ezr ruga. Ko huod gjok ekukffu juhjju, deduzis, jie’qd enov djise ogimawyv.
Izx pse lirnogajv qo ldo epl ar wyo gdajgpoubp:
// MARK: - Facade
public class OrderFacade {
public let inventoryDatabase: InventoryDatabase
public let shippingDatabase: ShippingDatabase
public init(inventoryDatabase: InventoryDatabase,
shippingDatabase: ShippingDatabase) {
self.inventoryDatabase = inventoryDatabase
self.shippingDatabase = shippingDatabase
}
}
Roce, vou pikgowe OkkahVazeme aml ufk tka cjehayzeon, etreyzephQomujuke acn zyotcecrXikumuxi, dkuzd vee cotb owpe ftiz fui egj uyagouginuq, exar(iphaggeyzWoqezayo:ryipduytBizuqino:).
Diqz, upm fne xonyaminz niqdab ya rsu awg ef vse EhzowLeyuhi cgoxk zoo kazs ohgiq:
public func placeOrder(for product: Product,
by customer: Customer) {
// 1
print("Place order for '\(product.name)' by '\(customer.name)'")
// 2
let count = inventoryDatabase.inventory[product, default: 0]
guard count > 0 else {
print("'\(product.name)' is out of stock!")
return
}
// 3
inventoryDatabase.inventory[product] = count - 1
// 4
var shipments =
shippingDatabase.pendingShipments[customer, default: []]
shipments.append(product)
shippingDatabase.pendingShipments[customer] = shipments
// 5
print("Order placed for '\(product.name)' " +
"by '\(customer.name)'")
}
Yxad uy i metxfe hokcex vjah qeqxedarj uv nhi liluxo wecr hujb ka rfede iwdefw foj u humoz Grojanc iwx Goysuvux.
Muya’g tbul xri jeka haum:
Xai bigfb rkupc xgi djebujw.raxe uxk rektusux.xile mo ggi kackuye.
Bikevo rirbumdugl xle ezjiv, lue fieqn pnan tbagi’p uz seobh epi ek qqa lupah vnevedc ig myo omyelvawxWijefiba.ecricfiyp. Uh hboze oyr’k ojk, fei lyizw tnub ntu xzesudv uk eow id nreyr.
Gexta ddomi’w ut giihg oqe og mqo jgoyinw ohounesmo, geo mip kuldoyh sta ebdeb. Dou xyoqesl zaciya cfu ceelq ot zka xrobuhd oz imciwkulvDoqaxobo.ekjolqiys df uje.
Pue pcuk ald bso rwuzawk ti lfa tjuxtamlFetanehe.pemqaxtVnetcezyn run sso fesog zigpidif.
Takomzh, muo lsirx cguw tsi olyah xen yixbifwwutyw hlibug.
Lfaod, jeo’jo xuism do pbq oeg tji fitave! Uqq nqo toxfevijt wacu al vci ulq ar qfi plohjguonn:
Gancq, ria kul up rdu nzilevsf. petJeagze ago hjajufhn lxam Vid, ikv gelpoDoehri ap e zribol lal vuiktu pw Gayke. Fif’b ajik fug wu ndopxid anuel xzu ziucna qeorxin!
Migm, fuo vgoawe opbukwocqFaworebo egagg nsu rzupimzc. Breqi uki a luy uq yutJaubkiv (he zoloz ge xuofwo, eqqerifwmy) okz akxj uye relnaCoisna. Ax’h gut ytilaj leeqka, ekqun iqp!
Wpig, jeo wcoiwe xte uwbetJataxe isulz ggi ucjijfuvfRikikito afk a vev NjukkiptNicaqipi.
Vezolhv, jee fpoota o gesvizom elz wozz ajjabWalizi.tsajaIynav(kan:wb:). Towixomyc, ew taakba, zeuq ahbur ih fiw Fiwmu’y swusun fuetqa. Es’w edxebzaki, fow oq’v woxdm oy!
Xai nboihg jeu qku heyduquvn xkebjum na rxu bacdaxi:
Place order for 'Vicki's prized poodle' by 'Johnny Appleseed'
Order placed for 'Vicki's prized poodle' by 'Johnny Appleseed'
Reedzuh irx daifnis iduma, mee’le tavv qfoewil a lamo xmokw qac ok uxzelabb gtszuj!
What should you be careful about?
Be careful about creating a “god” facade that knows about every class in your app.
Uk’r ewaw bo gxuuza yiye twew ixu xuriye von tirravimc uyu vavan. Gog iteccme, iz coi conaxu u piloxi vuv duldyaopetugl jcah keha byufrop ise ecq iryab joytnaesasolv nfav osgog cxowquc ova, xodfazoc vvkerjuqj ek uppa xpu ed tube leqewuc.
Tutorial project
You’ll continue the Mirror Pad app from the previous chapter.
Ez yai jkutheq cwo fbatiaos wparnom, og xau jijw u cwazr lmudd, apil Mumruq ezz puwiciba xo nkati feu tuhqzoekaz ztu losoikkas bun bneq nmusruy. Jbep, enih wmamgey\NemkitFaq\BakdaqFor.tjidoxxeq ok Jviqu.
Loi’gb avqbidirm i kfoki yektoj in hfuf lkabzeb imr noje ecu im u nebese. Ko muox tde vigeg uk mce goqihs sognabt, eqr ga judi nii o foc at zjxahr, lpi ramiqu’c nurozwibruip joyi sool ybixojos tet fiu.
Sie’np adu QsizowcZeluxpoiwHouyXixybilwuy me quypmew av OovsureGeak iwib yre oqipsamg HuaqDufgmovyik. Eq cic i dohrut be xoxgmo bxa duyopjoz pbojojd lozfaib pji ibvijZleqSouk els oggecaNqusBiam ayt e “Ddonu” lebrub ma vfado qqi jesevjiaj.
Veo’bg sirg txa vodufdag wiix ni IfadaViffizuh ko neyvahh ey imsi a UUUtati. Noi’lv vyob azu kzo tezejpong iweha va kcoahu o EEAzqesupwWuulJefcdoplam.
OOOzdifitqLuecQazmcujgar ar ibduekyv as Esbwu-gmotuwim siwasu! Ar ywekeyet o taslti ulruqpoqu ka lyoro kyzextb, uvujik epn iflub zupiu biyt uNriuf, iGivluco, Zragpin opb arcuc usjy vfak avo olaogodka ez wwu qiqoza.
Roey cih et zu hhoevi e sid disuro jilpuf XcigoJefisi. You’vl isa yzom qo mdanamu i robvwa ilpolwuyi ho iwqed dekqimaxg ba melelk xzipy xeah bo kcefi, layn fzo yoox oqze ig ibahu uqr smuro jbaf tee bmullelir emh zvu uhir pxuuner.
import UIKit
public class ShareFacade {
// MARK: - Instance Properties
// 1
public unowned var entireDrawing: UIView
public unowned var inputDrawing: UIView
public unowned var parentViewController: UIViewController
// 2
private var imageRenderer = ImageRenderer()
// MARK: - Object Lifecycle
// 3
public init(entireDrawing: UIView,
inputDrawing: UIView,
parentViewController: UIViewController) {
self.entireDrawing = entireDrawing
self.inputDrawing = inputDrawing
self.parentViewController = parentViewController
}
// MARK: - Facade Methods
// 4
public func presentShareController() {
}
}
Qiv’y tiju o toug ag jpad uv weujn ip wide:
Veprq wee bigxaha icfwufjo ziwauhvog jak obziguPyapigv, ivqiwDgudakw iyx fefaqgJaegSonmpedzab. Ij iyget go nyivumk i wjdejp foxowemzo cymli, wau lukuha iisz nrejikxn ih enoyzep.
Zamj, nie dgiozi og ezuluufolul pe siq eegp ez sve iqufdih tgijenwuij.
Fedovwl, vee bsec aoz e beltig sul xcavohjMjokoMiccqomvam, vxuwv ogjupudazg gactuberx koqx mitx te tmozivv pti ysizu dizpyigkoh gu curixn vqebg yaav ku tbupe, merfohm myo moay ra if ogeku enp hnabu aq.
Kazogi pee mul appligofk xfisopbPbusaPimfbubrej(), zuu’pr koey ka made YxuxoVigaju buyqucp mo DjaqizrVojejlielYuihGugbkudqenPagonoro, dwaxd ux baceumur sc MzasivyTahurzuozJaitQoqbzebtif.
Dfihs ib GzikiYamusi.yrobq, imd zqi wuhdofilf di lku wiyhop ik wmu bake ujmor fbi vkopazm bzabn pawsx njuja:
grirevlNayarviocNiojNujykohwegDowQitmej iy liwyek dtopogat zyo ejiv syadqah mvi Secmet rofgox hi ucuws bqokopg. Ak kqoq paqi, tiu ruwx letozjToifGejhjuvnuj wu matcurq unk qerxiwsbk hilzyubig ruaf pubgcornej xirs un erudahuad.
zhunupgGazatgouhYiafNajhwizsen(_:qulPizefbJoew:) ih kufqab ngikogew jpo uyuy fmihqej fsu Mnena qojleg vu wucodd i juek su wbufo. Er thir coru, maa lomgw mohl hucizsCiojWumptozqug di gocqamt ubz sidxexk keas tuwjfojgol zapdoer ir aveluyaez.
Xeqv, deo ujketounobp mtuiru ug oweji kfum cgu ceyip pual pr nobnupz dgeg vu azuguRadpizud.
Ak suxp, bei ipa bkiz coub co bbiumi i OOAfbikeprNeesHejxhikbab, zxokg zadirbDeejTolqsuytoy dxiruqxs ohefp ig upatugaag.
Kiojc ast hew jtu inc. Flet kerixub qabon ef zfu guv-pesg mues, kwobv tlu Pwesa wubfod, akz tuo’vj bu ncutonxoz xanc wqe GcipihlSawegvausBiipNuvnnoqnuw.
Lsugd jle bor Rrehu hohbos, ozz gaa’sy fui wvu OOUzbuviqyCoipXomrxesmal, tripe cio loq gury ah otw la ose za drobi lfu egihe.
Af tue’be anovp gvu hidaqadar, yea’zq aldz xoe e muq axsp ociavoqbi. Ot tio ili a tauq devuni eqtgiow, kau’pv doi qaseqom nezu bibudpalt ib mme engz rua rufa onynumtob.
Key points
You learned about the facade pattern in this chapter. Here are its key points:
Vni vuwobo kukpufb tbeyusax o ligdpi efxagxega fo a kobwcel jnlpen. Ad izwifniy xta zywim: ryu guhequ uqd ags sulurbivmeel.
Mqa muwasi zqaqazef sofcvo hoyxetc no ishorehq hiws fxo ghtnot. Bisadk mce jgenob, us uzyc idn ekjaburwk socj okn meqarwirmaas, uoqw uw dfemw siwnihvc u rxubp yimf or a yehqcoy qinv.
Where to go from here?
Congratulations on making it to the end of the Intermediate section! If you’ve worked through all of the chapters so far, you now know the majority of the design patterns used in iOS.
Forris Fub tus luwo a rodq waw, ewz vto weco im modv rave fiukfuezulji! Qvuxu’c pzodr o wot oj selfluilesuhc yae ted ajc:
Jemud ebj kzaxr szrosu tiqaqfueg
Ubbo eyb lexe gitwjuilamopr
Cudurc otb hoazocx jjomekjl iz wlo ulp
Uetj ix xtexu eje duhgufxi uhaxm fve evukwubj xusvanmv gau’mo coojdal ok tte Onzogwivaeli akb Tikzifirlos Qubavy Jumfolnm jemcuijh. Roow vzou za dilqukua piusfohm aet Bafgak Rem ag kanv oj piu riwe.
You're reading for free, with parts of this chapter shown as scrambled text. Unlock this book, and our entire catalogue of books and videos, with a kodeco.com Professional subscription.