Гадна чимэглэлийн дизайны загварууд. Алсын фасад

Уншихаасаа өмнө дараах конвенц, үзэл баримтлалтай танилцана уу. Энэ нийтлэл нь тодорхой давтамжтайгаар шинэчлэгддэг тул хэрэв та үүнийг өмнө нь уншиж байсан бол өгөгдөл өөрчлөгдөөгүй нь баримт биш юм.

Фасадангилалд хамаарах бүтцийнхэв маяг. Тодорхой дэд системийн интерфэйсийн багцын оронд нэгдсэн интерфейсийг төлөөлдөг. Гадна чимэглэлийн загвар нь дэд системүүдийг ашиглахад хялбар болгодог дээд түвшний интерфейсийг тодорхойлдог.

Нарийн төвөгтэй системийг дэд системд хуваах нь дизайны үйл явцыг хялбарчлахаас гадна нэг дэд системийн нөгөөгөөс хамаарлыг багасгахад тусалдаг. Гэсэн хэдий ч энэ нь ийм дэд системийг хамтад нь ашиглах нь нэлээд хэцүү болоход хүргэдэг. Энэ асуудлыг шийдэх нэг арга бол фасадны загварыг нэвтрүүлэх явдал юм.

Энэ нь тодорхой системээс хамаардаг тул тодорхой хэрэгжилтгүй хэв маягийн нэг юм. Ерөнхийдөө бид дараах өөрчлөлтийг хийх хэрэгтэй.

Саарал тэгш өнцөгт нь бидний дэд системүүдийг агуулдаг бөгөөд тэдгээр нь хоорондоо зарим нэг хамааралтай байдаг (тэдгээр нь байхгүй байж болно). Эхний гурван блок нь энэ дэд системтэй харилцаж буй үйлчлүүлэгч кодын гурван хэсгийг заана. Бидний даалгавар бол дэд системүүдтэй харилцахад хангалттай энгийн, нэгдсэн интерфэйсийг бий болгох явдал юм даалгаврын хүрээнд,тэдгээр. Бид бүх тохиолдолд бүх нийтийн интерфейс хийх шаардлагагүй, учир нь ихэнх тохиолдолд энэ нь шаардлагагүй бөгөөд илүү төвөгтэй харилцан үйлчлэл, хөгжүүлэлтийн хугацааг уртасгахад хүргэдэг.

Доорх нэг хэрэгжилтийн тойм зураг байна:

/** * SystemA */ анги Банк ( нийтийн функц OpenTransaction() () нийтийн функц CloseTransaction() () нийтийн функц transferMoney($ дүн) () ) /** * SystemB */ класс Клиент ( нийтийн функц OpenTransaction() () ) нийтийн функц CloseTransaction() () нийтийн функц шилжүүлэхМөнгө($дүг) () ) /** * SystemC */ анги Бүртгэл ( нийтийн функц logTransaction() () ) анги Фасад ( нийтийн функц шилжүүлэг($ дүн) ( $Банк = new Bank(); $Client = new Client(); $Log = new Log(); $Bank->OpenTransaction(); $Client->OpenTransaction(); $Log->logTransaction("Гүйлгээ нээлттэй"); $ Банк->мөнгө шилжүүлэх(-$дүгээр); $Log->logTransaction("Банкнаас мөнгө шилжүүлэх"); $Client->transferMoney($дүгээр); $Log->logTransaction("Харилцагч руу мөнгө шилжүүлэх"); $Банк ->CloseTransaction(); $Client->CloseTransaction(); $Log->logTransaction("Гүйлгээ хаах"); ) ) // Клиент код $Transfer = new Facade(); $Transfer->шилжүүлэх(1000);

Алсын фасадны тодорхойлолт

Сүлжээний үр ашгийг дээшлүүлэх объектын аргуудыг нэгтгэх нийтлэг интерфейсээр хангадаг.

Объект хандалтат загвар дахь Remote Facade загвар нь жижиг аргуудтай жижиг объектуудтай ажиллах ажлыг сайжруулдаг. Жижиг техникүүд нь зан үйлийг хянах, өөрчлөх, үйлчлүүлэгчийн хэрэглээний талаарх ойлголтыг сайжруулах томоохон боломжийг санал болгодог. Энэхүү нарийн ширхэгтэй зан үйлийн нэг үр дагавар нь ихэвчлэн олон тооны аргуудын дуудлагатай объектуудын хооронд маш их харилцан үйлчлэл байдаг.

Нэг хаягийн орон зайд "нарийн ширхэгтэй" харилцан үйлчлэл сайн ажилладаг боловч процессуудын хооронд харилцан үйлчлэл үүсэхэд бүх зүйл өөрчлөгддөг. Алсын дуудлага нь илүү үнэтэй байдаг, учир нь маш их зүйлийг хийх шаардлагатай байдаг: заримдаа өгөгдлийг цэгцлэх, аюулгүй байдлыг шалгах, пакетуудыг унтраалга руу чиглүүлэх шаардлагатай байдаг. Хэрэв дэлхийн өөр өөр өнцөгт хоёр процесс явагддаг бол гэрлийн хурд хүртэл үүрэг гүйцэтгэдэг. Хатуу үнэн нь аливаа процесс хоорондын харилцаа холбоо нь процесс доторх дуудлагаас илүү үргүй зардалтай байдаг. Хоёр процесс нэг машин дээр ажиллаж байгаа ч гэсэн. Энэхүү гүйцэтгэлийн нөлөөллийг залхуу оновчлол сонирхогчид ч үл тоомсорлож болохгүй.

Үүний үр дүнд алсын удирдлагатай холбоотой аливаа объектод ямар нэгэн зүйл хийхэд шаардагдах хүсэлтийн тоог багасгах илүү ерөнхий интерфейс шаардлагатай байдаг. Энэ нь зөвхөн аргуудаас гадна объектуудад нөлөөлдөг. Та нэхэмжлэх болон түүний бүх зүйлийг тусад нь шаардахын оронд нэг хүсэлтээр бүх нэхэмжлэхийн зүйлийг уншиж, шинэчлэх хэрэгтэй. Энэ нь объектын бүтцэд бүхэлд нь нөлөөлдөг. Бид жижиг объект, жижиг аргуудын сайн зорилгын талаар мартах ёстой. Програмчлал улам бүр хэцүү болж, бүтээмж буурч, буурч байна.

Алсын фасадны загвар нь илүү "нарийн ширхэгтэй" объектуудын бүтэц дээр байрлах ерөнхий "фасад" (GF-ийн дагуу) дүрслэгддэг. Эдгээр объектуудын аль нь ч алсын интерфейсгүй бөгөөд Remote Facade нь бизнесийн логикийг агуулдаггүй. Бүх Remote Facade нь ерөнхий хүсэлтийг дэд объектуудад зориулсан жижиг хүсэлт болгон хөрвүүлэх явдал юм.

Сүүлд шинэчлэгдсэн: 2015/10/31

Гадна чимэглэлийн загвар нь системтэй харилцах хялбаршуулсан интерфэйсийг бий болгосноор түүний нарийн төвөгтэй байдлыг нуудаг дизайны загвар юм.

Фасадыг хэзээ хэрэглэх вэ?

    Хэрэв та нарийн төвөгтэй системтэй бол түүнтэй ажиллахыг хялбарчлах хэрэгтэй. Фасад нь үйлчлүүлэгч болон системийн хоорондын харилцан үйлчлэлийн нэг цэгийг тодорхойлох боломжийг танд олгоно.

    Үйлчлүүлэгч болон нарийн төвөгтэй систем хоорондын хамаарлын тоог багасгах шаардлагатай үед. Гадна чимэглэлийн объектууд нь системийн бүрэлдэхүүн хэсгүүдийг үйлчлүүлэгчээс салгах, тусгаарлах, бие даан хөгжүүлэх, хамтран ажиллах боломжийг олгодог.

    Нарийн төвөгтэй систем дэх бүрэлдэхүүн хэсгүүдийн дэд системийг тодорхойлох шаардлагатай үед. Тусдаа дэд систем бүрийн бүрэлдэхүүн хэсгүүдийн фасадыг бий болгох нь тэдгээрийн хоорондын харилцан үйлчлэлийг хялбарчилж, бие биенээсээ хараат бус байдлыг нэмэгдүүлэх болно.

UML-д фасадны ерөнхий диаграммыг дараах байдлаар илэрхийлж болно.

C# хэл дээрх албан ёсны програмын тодорхойлолт дараах байдлаар харагдаж болно.

Class SubsystemA ( public void A1() () ) class SubsystemB ( public void B1() () ) class SubsystemC ( public void C1() () ) public class Facade ( SubsystemA subsystemA; SubsystemB дэд системB; SubsystemC дэд системC; нийтийн Facade(SubsystemA) sa, SubsystemB sb, SubsystemC sc) ( дэд системA = sa; дэд системB = sb; дэд системC = sc; ) нийтийн хүчингүй Үйлдэл1() ( дэд системA.A1(); дэд системB.B1(); дэд системC.C1(); ) нийтийн хүчингүй Үйлдэл2 () ( subsystemB.B1(); subsystemC.C1(); ) ) анги Үйлчлүүлэгч ( нийтийн хүчингүй Үндсэн() ( Гадна чимэглэлийн фасад = шинэ Гадна чимэглэлийн(шинэ Дэд системA(), шинэ дэд системB(), шинэ дэд системC()); фасад. Operation1(); фасад.Operation2(); ) )

Оролцогчид

    Ангиуд SubsystemA, SubsystemB, SubsystemC гэх мэт. нь үйлчлүүлэгчийн харилцах ёстой нарийн төвөгтэй дэд системийн бүрэлдэхүүн хэсэг юм

    Үйлчлүүлэгч дэд системийн бүрэлдэхүүн хэсгүүдтэй харилцдаг

    Гадна фасад - бүрэлдэхүүн хэсгүүдтэй ажиллахын тулд үйлчлүүлэгчдэд интерфейс өгдөг шууд фасад

Загварыг бодит асуудалд ашиглах талаар авч үзье. Visual Studio дээр код бичих нь нэгдсэн хөгжүүлэлтийн орчин үүсэхээс өмнө код хэрхэн бичигдсэнтэй харьцуулахад таашаал авдаг гэдэгтэй ихэнх програмистууд санал нийлэх байх гэж бодож байна. Бид зүгээр л код бичээд, товчлуур дээр дарахад л хангалттай - програм бэлэн боллоо. Энэ тохиолдолд IDE нь програмыг эмхэтгэх, ажиллуулахад төвөгтэй байдлыг нуудаг фасад юм. Одоо энэ фасадыг C# програм дээр дүрсэлцгээе:

Ангийн програм ( static void Main(string args) ( TextEditor textEditor = new TextEditor(); Compiller compiller = new Compiller(); CLR clr = new CLR(); VisualStudioFacade ide = new VisualStudioFacade(textEditor, compiller, clr); Программист програмист = new Programmer(); programmer.CreateApplication(ide); Console.Read(); ) ) // текст засварлагч анги TextEditor ( public void CreateCode() ( Console.WriteLine("Бичгийн код"); ) public хүчингүй Хадгалах() ( Console.WriteLine("Хадгалах код"); ) ) анги Хөрвүүлэгч ( public void Compile() ( Console.WriteLine("Програмыг эмхэтгэх"); ) ) анги CLR ( public void Execute() ( Console.WriteLine("Гүйцэтгэх" програм "); ) public void Finish() ( Console.WriteLine("Програмыг дуусгах"); ) ) анги VisualStudioFacade ( TextEditor textEditor; Compiller compiller; CLR clr; public VisualStudioFacade(TextEditor te, Compiller compil, CLR cr) this. textEditor = te; this.compiller = compil; this.clr = clr; ) public void Start() ( textEditor.CreateCode(); textEditor.Save(); compiller.Compile(); clr.Execute(); ) public void Stop() ( clr.Finish(); ) ) анги Программист ( public void CreateApplication(VisualStudioFacade facade) ( facade.Start(); facade.Stop(); ) )

Энэ тохиолдолд системийн бүрэлдэхүүн хэсгүүд нь TextEditor анги, Compiller анги, нийтлэг хэлний ажиллах цагийн CLR анги юм. Үйлчлүүлэгч нь програмистын анги, фасад нь VisualStudioFacade анги бөгөөд өөрийн аргуудаар дамжуулан ажлыг бүрэлдэхүүн хэсгүүд болон тэдгээрийн аргуудад шилжүүлдэг.

Үйлчлүүлэгч шаардлагатай бол бүрэлдэхүүн хэсгүүдэд шууд хандах боломжтой, жишээлбэл, текст засварлагчийг бусад бүрэлдэхүүн хэсгүүдээс тусад нь ашиглах боломжтой гэдгийг анхаарах хэрэгтэй. Гэхдээ програмыг бий болгох үйл явц нь нарийн төвөгтэй тул фасадыг ашиглах нь дээр. Түүнчлэн, энэ нь эдгээр бүрэлдэхүүн хэсгүүдтэй ажиллах цорын ганц боломжтой фасад биш юм. Шаардлагатай бол та өөр фасадыг үүсгэж болно, яг л бодит амьдрал дээр бид өөр хөгжлийн орчныг ашиглаж болно.

GoF номд энэ тухай тайлбарласан байдаг загварзарим дэд систем дэх олон интерфэйсүүдэд нэгдсэн интерфейсээр хангадаг. Ном" Дизайн загварууд"ижил тайлбарыг өгч, дэд системийн нарийн төвөгтэй байдлыг нуун дарагдуулсан хэв маягийг анхаарч үздэг" Фасад"хэрэглэхэд хялбар интерфэйсээр дамжуулан дэд системийн бүх боломжуудыг хангахын зэрэгцээ.

Гадна чимэглэлийн загвар хэрхэн ажилладаг тухай энгийн практик жишээг үзэхийн тулд маш их бохирдсон болон бага зэрэг бохирдсон угаалгын машиныг ердөө хоёр угаах циклтэй гэж төсөөлөөд үз дээ.

Угаалгын машин нь горим бүрийн хувьд урьдчилан тодорхойлсон үйлдлүүдийг хийх ёстой: усны температурыг тохируулах, усыг халаах, угаах мөчлөгийн үргэлжлэх хугацааг тохируулах, угаалгын нунтаг нэмэх, цайруулагч нэмэх, зөөлрүүлэгч нэмэх гэх мэт. Горим бүр нь өөр өөр угаах зааврыг шаарддаг (өөр өөр хэмжээний угаалгын нунтаг, өндөр/бага температур, урт/богино эргэлт гэх мэт).

Энгийн интерфэйс нь усны тохиромжтой температур, эргүүлэх хугацаа, угаах мөчлөгийг сонгох нарийн төвөгтэй логикийг нууж, угаалгын нунтаг, цайруулагч эсвэл зөөлрүүлэгч нэмэх өөр өөр аргуудыг нууж, хоёр угаах горимоор хангадаг.

Угаалгын машин хэрэглэгч юм угаах нарийн төвөгтэй логикийн талаар бодох шаардлагагүй (температур, мөчлөгийн үргэлжлэх хугацааг сонгох гэх мэт). Хэрэглэгчийн хийх ёстой цорын ганц зүйл бол угаалга нь маш их бохирдсон эсэхийг шийдэх явдал юм. Энэ бол "Facade" загварын мөн чанаругаалгын машины загвартай холбоотой.

"Гадна чимэглэлийн" загварихэвчлэн дараах зорилго, тохиолдолд хэрэгжүүлдэг.

  • хуучин үйлдвэрлэлийн удирдлагын тогтолцоонд энгийн бөгөөд нэгдмэл нэвтрэх боломжийг олгох;
  • драйвер зэрэг ангиудад зориулсан нийтийн API үүсгэх;
  • боломжтой үйлчилгээнд бүдүүн ширхэгтэй хүртээмжтэй болгох. Үйлчилгээг дээрх угаалгын машины жишээн дээр бүлэглэсэн;
  • сүлжээний дуудлагын тоог багасгах. Фасад нь дэд систем рүү олон дуудлага хийдэг бол алсын үйлчлүүлэгч фасад руу нэг дуудлага хийх ёстой;
  • энгийн, аюулгүй байдлыг хангахын тулд програмын ажлын урсгал болон дотоод дэлгэрэнгүй мэдээллийг багтаах.

Дашрамд хэлэхэд, фасадуудзаримдаа хийсвэр синглтон үйлдвэр болгон хэрэгжүүлдэг.

Гадна чимэглэлийн ангиллын диаграм. Ангийн диаграмаас харж болно Зураг 3.1, Гадна чимэглэлийн загвар нь нарийн төвөгтэй логикийг багтаасан үндсэн системд энгийн интерфейсээр хангадаг.

Зураг 3.1. "Facade" загварын ангийн диаграмм.

Фасаднь нийлмэл ангиллын систем, номын сан эсвэл фреймворкийг энгийн интерфейсээр хангадаг бүтцийн дизайны загвар юм.

Асуудал

Таны код нь зарим нэг төвөгтэй номын сан эсвэл хүрээний олон тооны объектуудтай ажиллах ёстой. Та эдгээр объектыг өөрөө эхлүүлэх, хамаарлыг зөв дараалалд оруулах гэх мэт зүйлсийг хийх ёстой.

Үүний үр дүнд таны ангиудын бизнесийн логик нь гуравдагч талын ангиудын хэрэгжилтийн дэлгэрэнгүй мэдээлэлтэй нягт холбоотой байдаг. Ийм кодыг ойлгох, хадгалахад нэлээд хэцүү байдаг.

Шийдэл

Фасад нь олон анги агуулсан нарийн төвөгтэй дэд системтэй ажиллах энгийн интерфейс юм. Фасад нь нийлмэл дэд системийг шууд ашиглах замаар 100% функцийг хангаагүй, тайлагдсан интерфейстэй байж болно. Гэхдээ энэ нь үйлчлүүлэгчид яг хэрэгтэй шинж чанаруудыг өгдөг бөгөөд бусад бүх зүйлийг нуудаг.

Хэрэв та маш олон хөдөлгөөнт хэсэг бүхий нарийн төвөгтэй номын сан ашиглаж байгаа бол фасад хэрэгтэй, гэхдээ танд зөвхөн түүний боломжуудын нэг хэсэг л хэрэгтэй.

Жишээлбэл, муурны видеог нийгмийн сүлжээнд байршуулах программ нь мэргэжлийн видео шахалтын санг ашиглаж болно. Гэхдээ энэ програмд ​​шаардлагатай бүх үйлчлүүлэгчийн код нь энгийн кодчилол (файлын нэр, формат) арга юм. Энэ аргаар анги үүсгэснээр та анхны нүүр царайгаа хэрэгжүүлдэг.

Амьдралаас авсан зүйрлэл


Дэлгүүр рүү залгаж, утсаар захиалга өгөхөд харилцагчийн үйлчилгээний төлөөлөгч нь дэлгүүрийн бүх үйлчилгээ, тасаг руу орох хаалга болно. Энэ нь танд захиалга үүсгэх систем, төлбөрийн систем, хүргэлтийн хэлтэст хялбаршуулсан интерфейсээр хангадаг.

Бүтэц



    Фасадтодорхой дэд системийн үйл ажиллагаанд хурдан нэвтрэх боломжийг олгодог. Энэ нь хүсэлтийг аль ангиудад дамжуулах шаардлагатайг, үүнд ямар өгөгдөл хэрэгтэйг "мэддэг".

    Нэмэлт фасадНэг төрлийн фасадыг янз бүрийн функцээр "бүхүүлэхгүй" байхын тулд нэвтрүүлж болно. Үүнийг үйлчлүүлэгч болон бусад фасадны аль алинд нь ашиглаж болно.

    Нарийн төвөгтэй дэд системолон төрлийн ангиас бүрддэг. Тэднийг ямар нэгэн зүйл хийлгэхийн тулд та дэд системийн бүтэц, объектыг эхлүүлэх дараалал гэх мэт нарийн ширийн зүйлийг мэдэх хэрэгтэй.

    Дэд системийн ангиуд нь фасадны оршин тогтнох талаар мэдэхгүй бөгөөд бие биетэйгээ шууд ажилладаг.

    Үйлчлүүлэгчнарийн төвөгтэй дэд системийн объектуудтай шууд ажиллахын оронд фасадыг ашигладаг.

Псевдокод

Энэ жишээнд Фасаднарийн төвөгтэй видео хөрвүүлэх хүрээтэй ажиллах ажлыг хялбаршуулдаг.


Нэг нүүрэнд олон хамаарлыг тусгаарлах жишээ.

Хэдэн арван ангиудтай шууд ажиллахын оронд фасад нь програмын кодыг видео хөрвүүлэх нэг аргаар хангадаг бөгөөд энэ нь өөрөө шаардлагатай хүрээний объектуудыг зөв тохируулах, шаардлагатай үр дүнд хүрэхэд анхаардаг.

// Гуравдагч талын видео хөрвүүлэх цогц тогтолцоонд зориулсан ангиуд. Бид // энэ кодыг хянадаггүй тул үүнийг хялбарчилж чадахгүй. анги VideoFile // ... анги OggCompressionCodec // ... анги MPEG4CompressionCodec // ... анги CodecFactory // ... анги BitrateReader // ... анги AudioMixer // ... // Оронд нь бид Facade үүсгэдэг. - ажиллахад хялбар интерфэйс // нарийн төвөгтэй хүрээтэй. Фасад нь хүрээний // бүх функцийг агуулдаггүй, гэхдээ энэ нь үйлчлүүлэгчдээс нарийн төвөгтэй байдлыг нуудаг. class VideoConverter бол хөрвүүлэх арга(файлын нэр, формат):Файл бол файл = шинэ ВидеоФайл(файлын нэр) sourceCodec = шинэ CodecFactory.extract(файл) хэрэв (формат == "mp4") destinationCodec = new MPEG4CompressionCodec() өөрөөр destinationCodec = шинэ OggCompressionCodec( ) буфер = BitrateReader.read(файлын нэр, sourceCodec) үр дүн = BitrateReader.convert(buffer, destinationCodec) үр дүн = (шинэ AudioMixer()).fix(үр дүн) буцаах шинэ Файл(үр дүн) // Програм нь цогцолбороос хамаарахгүй хувиргах хүрээ // видео. Дашрамд хэлэхэд, хэрэв та гэнэт хүрээг өөрчлөхөөр шийдсэн бол та // зөвхөн фасадны ангийг дахин бичих хэрэгтэй болно. анги Хэрэглээ бол үндсэн арга() бол хувиргагч = шинэ VideoConverter() mp4 = convertor.convert("funny-cats-video.ogg", "mp4") mp4.save()

Хэрэглэх чадвар

Нарийн төвөгтэй дэд системд энгийн эсвэл задалсан интерфейсийг үзүүлэх шаардлагатай үед.

Хөтөлбөр хөгжихийн хэрээр дэд системүүд илүү төвөгтэй болдог. Ихэнх хэв маягийг хэрэглэснээр жижиг ангиуд гарч ирдэг, гэхдээ илүү олон тоо байдаг. Ийм дэд системийг дахин ашиглах, тодорхой хэрэгцээнд зориулан өөрчлөх нь илүү хялбар байдаг ч үүнтэй зэрэгцэн дэд системийг өөрчлөхгүйгээр ашиглах нь улам хэцүү болдог. Фасад нь анхдагчаар тодорхой төрлийн системийг санал болгодог бөгөөд энэ нь ихэнх үйлчлүүлэгчдэд тохирсон байдаг.

Дэд системийг тусдаа давхарга болгон задлахыг хүсвэл.

Дэд системийн түвшин бүрт нэвтрэх цэгүүдийг тодорхойлохын тулд фасадыг ашиглана уу. Хэрэв дэд системүүд бие биенээсээ хамааралтай бол дэд системүүдэд зөвхөн фасадаар дамжуулан мэдээлэл солилцох боломжийг олгох замаар хамаарлыг хялбаршуулж болно.

Жишээлбэл, ижил төвөгтэй видео хөрвүүлэх системийг авч үзье. Та үүнийг аудио болон видео ажлын давхарга болгон хуваахыг хүсч байна. Эдгээр хэсгүүдийн хувьд та фасадыг бүтээхийг оролдож, аудио болон видео боловсруулалтын ангиудыг шууд биш харин эдгээр фасадуудаар дамжуулан өөр хоорондоо харилцах боломжтой.

Хэрэгжүүлэх үе шатууд

    Нарийн төвөгтэй дэд системээс илүү хялбар интерфейс үүсгэх боломжтой эсэхийг тодорхойлох. Хэрэв энэ интерфейс нь үйлчлүүлэгч дэд системийн дэлгэрэнгүй мэдээллийг мэдэх шаардлагагүй бол та зөв зам дээр байна.

    Энэ интерфэйсийг хэрэгжүүлдэг фасадны анги үүсгэ. Энэ нь үйлчлүүлэгчийн дуудлагыг зөв дэд системийн объект руу дамжуулах ёстой. Фасад нь дэд системийн объектуудыг зөв эхлүүлэхэд анхаарах ёстой.

    Үйлчлүүлэгч зөвхөн фасадтай ажилладаг бол та хамгийн их ашиг хүртэх болно. Энэ тохиолдолд дэд системийн өөрчлөлт нь зөвхөн фасадны кодонд нөлөөлөх бөгөөд үйлчлүүлэгчийн код ажиллах болно.