Фаса́д — шаблон проєктування, призначений для об'єднання групи підсистем під один уніфікований інтерфейс, надаючи доступ до них через одну точку входу. Це дозволяє спростити роботу з підсистемами.
Фасад належить до структурних шаблонів проєктування.
Складові шаблону
Класи, з яких складається шаблон можна розділити на 3 частини:
- фасад;
- підсистеми;
- клієнти.
Ролі складових
Фасад
- Визначає певним підсистемам інтерфейс, отже знає кому адресувати запити;
- делегує запити клієнтів потрібним об'єктам підсистеми;
- створює нові методи, котрі об'єднують виклики об'єктів системи і\або додають свою логіку;
- приховує підсистеми;
- зменшує кількість параметрів методів, шляхом попередньої підстановки визначених значень.
Підсистема
- реалізує функціонал, закритий та не видимий для зовнішніх компонентів
- виконує роботу, запитану клієнтом через фасад.
- не зберігає посилання на фасад — це означає що одна підсистема може мати довільну кількість фасадів.
Клієнт
- здійснює запити фасаду;
- не знає про існування підсистем.
Переваги та недоліки
Переваги
- Приховує реалізацію підсистеми від клієнтів, що полегшує використання підсистеми
- Сприяє слабкій взаємодії між підсистемою та її клієнтами. Це дозволяє змінити класи, які включають підсистему, не впливаючи на клієнтів.
- Зменшує компіляційні залежностей у великих програмних системах
- Спрощує системи перенесення на інші платформи, оскільки менш імовірно, що для побудови однієї підсистеми потрібно побудувати всі інші
Недоліки
- Не заважає сучасним клієнтам отримувати доступ до базових класів
- Фасад не додає жодної функції, він просто спрощує інтерфейси
Випадки використання
Фасад використовується у випадках, коли потрібно:
- спростити доступ до складної системи;
- створити рівні доступу до системи;
- додати стійкість до змін підсистем;
- зменшити кількість сильних зв'язків між клієнтом та підсистемою, але залишити доступ до повної функціональності.
Зв'язок з іншими патернами
- Фасад створює новий інтерфейс доступу, адаптер — використовує старий
Реалізація
C++
#include <iostream> #include <string> using namespace std; // Абстрактний музикант - не є обов'язковою частиною патерну, введений для спрощення коду class Musician { private: string name; public: Musician(string name) { this->name = name; } virtual ~Musician() {} protected: void output(string text) { cout << this->name << " " << text << "." << endl; } }; // Конкретні музиканти struct Vocalist : public Musician { Vocalist(string name) : Musician(name) {} void singCouplet(string coupletNumber) { string text = "заспівав куплет №" + coupletNumber; output(text); } void singChorus() { output("заспівав приспів"); } }; struct Guitarist : public Musician { Guitarist(string name) : Musician(name) {} void playCoolOpening() { output("починає з крутого виступу"); } void playCoolRiffs() { output("грає круті рифи"); } void playAnotherCoolRiffs() { output("грає інші круті рифи"); } void playIncrediblyCoolSolo() { output("лабає неймовірно круте соло"); } void playFinalAccord() { output("закінчує пісню супер акордом"); } }; struct Bassist : public Musician { Bassist(string name) : Musician(name) {} void followTheDrums() { output("слідкує за барабанами"); } void changeRhythm(string type) { string text = "перейшов на ритм "; output(text + type); } void stopPlaying() { output("закінчує грати"); } }; struct Drummer : public Musician { Drummer(string name) : Musician(name) {} void startPlaying() { output("починає грати"); } void stopPlaying() { output("закінчує грати"); } }; // Фасад — в цьому випадку, рок-група class BlackSabbath { private: Vocalist* vocalist; Guitarist* guitarist; Bassist* bassist; Drummer* drummer; public: BlackSabbath() { vocalist = new Vocalist("Оззі Осборн"); guitarist = new Guitarist("Тоні Айоммі"); bassist = new Bassist("Гізер Батлер"); drummer = new Drummer("Біл Уорд"); } void playCoolSong() { guitarist->playCoolOpening(); drummer->startPlaying(); bassist->followTheDrums(); guitarist->playCoolRiffs(); vocalist->singCouplet("1"); bassist->changeRhythm("приспів"); guitarist->playAnotherCoolRiffs(); vocalist->singChorus(); bassist->changeRhythm("куплет"); guitarist->playCoolRiffs(); vocalist->singCouplet("2"); bassist->changeRhythm("приспів"); guitarist->playAnotherCoolRiffs(); vocalist->singChorus(); bassist->changeRhythm("куплет"); guitarist->playIncrediblyCoolSolo(); guitarist->playCoolRiffs(); } }; void main() { BlackSabbath* band = new BlackSabbath(); band->playCoolSong(); }
C#
using System; namespace FacadeExample { // Клас клієнта class Client { static void Main(string[] args) { //Створюємо екземпляр фасаду - інтерфейс підсистем Facade facade = new Facade(); facade.CallPaired(); Console.WriteLine("\n\n"); facade.CallUnpaired(); Console.ReadKey(); } } // Клас фасаду class Facade { Subsystem1 first; Subsystem2 second; Subsystem3 third; Subsystem4 fourth; Subsystem5 fifth; public Facade() { this.first = new Subsystem1(); this.second = new Subsystem2(); this.third = new Subsystem3(); this.fourth = new Subsystem4(); this.fifth = new Subsystem5(); } //Виклик методів з підсистем Subsystem2 та Subsystem4 public void CallPaired() { Console.WriteLine("Результати роботи методів підсистем з парним індексом (2,4)\n"); second.Method(); fourth.Method(); } //Виклик методів з підсистем Subsystem1, Subsystem3 та Subsystem5 public void CallUnpaired() { Console.WriteLine("Результати роботи методів підсистем з непарним індексом (1,3,5)\n"); first.Method(); third.Method(); fifth.Method(); } } // Клас підсистеми class Subsystem1 { public void Method() { Console.WriteLine("Метод першої підсистеми"); } } // Клас підсистеми class Subsystem2 { public void Method() { Console.WriteLine("Метод другої підсистеми"); } } // Клас підсистеми class Subsystem3 { public void Method() { Console.WriteLine("Метод третьої підсистеми"); } } // Клас підсистеми class Subsystem4 { public void Method() { Console.WriteLine("Метод четвертої підсистеми"); } } // Клас підсистеми class Subsystem5 { public void Method() { Console.WriteLine("Метод п'ятої підсистеми"); } } }
Джерела
- www.dofactory.com [ 29 квітня 2012 у Wayback Machine.]
- Design Patterns: Elements of Reusable Object-Oriented Software [ 9 листопада 2012 у Wayback Machine.]
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Fasa d shablon proyektuvannya priznachenij dlya ob yednannya grupi pidsistem pid odin unifikovanij interfejs nadayuchi dostup do nih cherez odnu tochku vhodu Ce dozvolyaye sprostiti robotu z pidsistemami Diagrama klasiv Fasad nalezhit do strukturnih shabloniv proyektuvannya Skladovi shablonuKlasi z yakih skladayetsya shablon mozhna rozdiliti na 3 chastini fasad pidsistemi kliyenti Roli skladovihFasad Viznachaye pevnim pidsistemam interfejs otzhe znaye komu adresuvati zapiti deleguye zapiti kliyentiv potribnim ob yektam pidsistemi stvoryuye novi metodi kotri ob yednuyut vikliki ob yektiv sistemi i abo dodayut svoyu logiku prihovuye pidsistemi zmenshuye kilkist parametriv metodiv shlyahom poperednoyi pidstanovki viznachenih znachen Pidsistema realizuye funkcional zakritij ta ne vidimij dlya zovnishnih komponentiv vikonuye robotu zapitanu kliyentom cherez fasad ne zberigaye posilannya na fasad ce oznachaye sho odna pidsistema mozhe mati dovilnu kilkist fasadiv Kliyent zdijsnyuye zapiti fasadu ne znaye pro isnuvannya pidsistem Perevagi ta nedolikiPerevagi Prihovuye realizaciyu pidsistemi vid kliyentiv sho polegshuye vikoristannya pidsistemi Spriyaye slabkij vzayemodiyi mizh pidsistemoyu ta yiyi kliyentami Ce dozvolyaye zminiti klasi yaki vklyuchayut pidsistemu ne vplivayuchi na kliyentiv Zmenshuye kompilyacijni zalezhnostej u velikih programnih sistemah Sproshuye sistemi perenesennya na inshi platformi oskilki mensh imovirno sho dlya pobudovi odniyeyi pidsistemi potribno pobuduvati vsi inshi Nedoliki Ne zavazhaye suchasnim kliyentam otrimuvati dostup do bazovih klasiv Fasad ne dodaye zhodnoyi funkciyi vin prosto sproshuye interfejsiVipadki vikoristannyaFasad vikoristovuyetsya u vipadkah koli potribno sprostiti dostup do skladnoyi sistemi stvoriti rivni dostupu do sistemi dodati stijkist do zmin pidsistem zmenshiti kilkist silnih zv yazkiv mizh kliyentom ta pidsistemoyu ale zalishiti dostup do povnoyi funkcionalnosti Zv yazok z inshimi paternamiFasad stvoryuye novij interfejs dostupu adapter vikoristovuye starijRealizaciyaC Priklad realizaciyi na movi S include lt iostream gt include lt string gt using namespace std Abstraktnij muzikant ne ye obov yazkovoyu chastinoyu paternu vvedenij dlya sproshennya kodu class Musician private string name public Musician string name this gt name name virtual Musician protected void output string text cout lt lt this gt name lt lt lt lt text lt lt lt lt endl Konkretni muzikanti struct Vocalist public Musician Vocalist string name Musician name void singCouplet string coupletNumber string text zaspivav kuplet coupletNumber output text void singChorus output zaspivav prispiv struct Guitarist public Musician Guitarist string name Musician name void playCoolOpening output pochinaye z krutogo vistupu void playCoolRiffs output graye kruti rifi void playAnotherCoolRiffs output graye inshi kruti rifi void playIncrediblyCoolSolo output labaye nejmovirno krute solo void playFinalAccord output zakinchuye pisnyu super akordom struct Bassist public Musician Bassist string name Musician name void followTheDrums output slidkuye za barabanami void changeRhythm string type string text perejshov na ritm output text type void stopPlaying output zakinchuye grati struct Drummer public Musician Drummer string name Musician name void startPlaying output pochinaye grati void stopPlaying output zakinchuye grati Fasad v comu vipadku rok grupa class BlackSabbath private Vocalist vocalist Guitarist guitarist Bassist bassist Drummer drummer public BlackSabbath vocalist new Vocalist Ozzi Osborn guitarist new Guitarist Toni Ajommi bassist new Bassist Gizer Batler drummer new Drummer Bil Uord void playCoolSong guitarist gt playCoolOpening drummer gt startPlaying bassist gt followTheDrums guitarist gt playCoolRiffs vocalist gt singCouplet 1 bassist gt changeRhythm prispiv guitarist gt playAnotherCoolRiffs vocalist gt singChorus bassist gt changeRhythm kuplet guitarist gt playCoolRiffs vocalist gt singCouplet 2 bassist gt changeRhythm prispiv guitarist gt playAnotherCoolRiffs vocalist gt singChorus bassist gt changeRhythm kuplet guitarist gt playIncrediblyCoolSolo guitarist gt playCoolRiffs void main BlackSabbath band new BlackSabbath band gt playCoolSong C Priklad realizaciyi na movi S using System namespace FacadeExample Klas kliyenta class Client static void Main string args Stvoryuyemo ekzemplyar fasadu interfejs pidsistem Facade facade new Facade facade CallPaired Console WriteLine n n facade CallUnpaired Console ReadKey Klas fasadu class Facade Subsystem1 first Subsystem2 second Subsystem3 third Subsystem4 fourth Subsystem5 fifth public Facade this first new Subsystem1 this second new Subsystem2 this third new Subsystem3 this fourth new Subsystem4 this fifth new Subsystem5 Viklik metodiv z pidsistem Subsystem2 ta Subsystem4 public void CallPaired Console WriteLine Rezultati roboti metodiv pidsistem z parnim indeksom 2 4 n second Method fourth Method Viklik metodiv z pidsistem Subsystem1 Subsystem3 ta Subsystem5 public void CallUnpaired Console WriteLine Rezultati roboti metodiv pidsistem z neparnim indeksom 1 3 5 n first Method third Method fifth Method Klas pidsistemi class Subsystem1 public void Method Console WriteLine Metod pershoyi pidsistemi Klas pidsistemi class Subsystem2 public void Method Console WriteLine Metod drugoyi pidsistemi Klas pidsistemi class Subsystem3 public void Method Console WriteLine Metod tretoyi pidsistemi Klas pidsistemi class Subsystem4 public void Method Console WriteLine Metod chetvertoyi pidsistemi Klas pidsistemi class Subsystem5 public void Method Console WriteLine Metod p yatoyi pidsistemi Dzherelawww dofactory com 29 kvitnya 2012 u Wayback Machine Design Patterns Elements of Reusable Object Oriented Software 9 listopada 2012 u Wayback Machine