Intent

  • Poskytuje jednotné rozhraní pro sadu rozhraní v subsystému.Facade definuje rozhraní vyšší úrovně, které usnadňuje použití subsystému.
  • Zabalte složitý subsystém jednodušším rozhraním.

Problém

Segment klientské komunity potřebuje zjednodušené rozhraní k celkové funkčnosti složitého subsystému.

Diskuze

Facade pojednává o zapouzdření složitého subsystému do jednoho objektu rozhraní. Tím se snižuje křivka učení nutná pro úspěšné využití subsystému. Podporuje také oddělení subsystému od jeho potenciálně mnoha klientů. Na druhou stranu, pokud jeFacade jediným přístupovým bodem subsystému, omezí to funkce a flexibilitu, které mohou potřebovat „zkušení uživatelé“.

Objekt Facade by měl být poměrně jednoduchým zastáncem nebo zprostředkovatelem. Neměl by se stát vševědoucím orákulem nebo „božským“ objektem.

Struktura

Facade bere „hádanku zabalenou do záhady zahalené tajemstvím“ a vkládá do ní obal, který zkrotí amorfní a nevyzpytatelnou hmotu softwaru.

SubsystemOne a SubsystemThree neinteragují s vnitřními komponentami SubsystemTwo. používají SubsystemTwoWrapper„fasádu“ (tj. abstrakci vyšší úrovně).

Příklad

Fasáda definuje jednotné rozhraní vyšší úrovně subsystému, které usnadňuje jeho používání. Spotřebitelé se s fasádou setkávají při objednávání z katalogu. Spotřebitel zavolá na jedno číslo a hovoří se zástupcem zákaznického servisu. Zástupce zákaznického servisu působí jako Facade a poskytuje rozhraní k oddělení vyřizování objednávek, fakturačnímu oddělení a oddělení expedice.

Kontrolní seznam

  1. Určit jednodušší, jednotné rozhraní pro subsystém nebo komponentu.
  2. Navrhněte „obalovou“ třídu, která zapouzdří subsystém.
  3. Fasáda/obal zachycuje složitost a spolupráci komponenty a deleguje příslušné metody.
  4. Klient používá (je spřažen) pouze s fasádou.
  5. Zvažte, zda by další fasády nepřinesly přidanou hodnotu.

Pravidla

  • Fasáda definuje nové rozhraní, zatímco adaptér používá staré rozhraní.
  • Pamatujte, že adaptér umožňuje spolupráci dvou existujících rozhraní na rozdíl od definování zcela nového rozhraní.
  • Zatímco Flyweight ukazuje, jak vytvořit spoustu malých objektů, Facadesukazuje, jak vytvořit jediný objekt reprezentující celý subsystém.
  • Mediátor je podobný Facade v tom, že abstrahuje funkčnost existujících tříd. Mediator abstrahuje/centralizuje libovolnou komunikaci mezi kolegiálními objekty. Rutinně „přidává hodnotu“,a je znám/odkazován kolegiálními objekty. Naproti tomu Facade definuje jednodušší rozhraní k subsystému, nepřidává novou funkcionalitu a třídy subsystému ji neznají.
  • Abstraktní Factory lze použít jako alternativu k Facade ke skrytí tříd specifických pro platformu.
  • Objekty Facade jsou často Singletony, protože je potřeba pouze jeden objekt Facade.
  • Adapter a Facade jsou oba wrappery; jsou to však různé druhy wrapperů. Záměrem Facade je vytvořit jednodušší rozhraní a záměrem Adapteru je navrhnout existující rozhraní.Zatímco Facade běžně obaluje více objektů a Adapter obaluje jeden objekt; Facade by mohl front-endovat jeden komplexní objekt aAdapter by mohl obalovat několik starších objektů.

Dotaz:

Odpověď: Rozdíl mezi vzorem Adapter a vzorem Facade spočívá v tom, že Adapter obaluje jednu třídu a Facade může představovat mnoho tříd? Ne! Nezapomeňte, že vzor Adapter mění rozhraní jedné nebo více tříd na jedno rozhraní, které očekává klient. Zatímco většina učebnicových příkladů ukazuje adaptérpřizpůsobující jednu třídu, možná budete muset přizpůsobit mnoho tříd, abyste poskytli rozhraní, na které je klient nakódován. Stejně tak může Facadeposkytovat zjednodušené rozhraní jedné třídě s velmi složitým rozhraním. Rozdíl mezi nimi není v tom, kolik tříd „obalují“, ale v jejich záměru.

Podpořte náš web zdarma a vlastněte elektronickou knihu!

  • 22 návrhových vzorů a 8 principů vysvětlených do hloubky
  • 406 přehledných, čtivých stránek bez žargonu
  • 228 přehledných a užitečných ilustrací a diagramů
  • Archiv s příklady kódu ve 4 jazycích
  • Podporována všechna zařízení: Formáty EPUB/MOBI/PDF

Více informací…

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.