→ Пошук по сайту       Увійти / Зареєструватися
Знання Патерни Структурні патерни — Structural patterns

10. Фасад — Facade

10.	Фасад — Facade

Уявімо, що ви вирішили провести свої вихідні дуже активно, а тому приїхали на зимовий курорт покататися на лижах. Перед тим як кататися, добре було б пересвідчитися, що ввечері буде де заночувати. Тому ви йдете в місцевий готель і замовляєте собі кімнату, відповідну до ваших вимог. Треба мати на чому кататися, тому ви йдете взяти лижі на прокат. Для того, щоб їх підібрати, у вас запитують вашу вагу, рівень професіоналізму, потім ви підбираєте черевики і палки, для підбору яких у вас ще спитають ваш ріст і розмір взуття.

Із цим усім на хребті ви йдете до каси і купуєте aбонемент на день. Не знаю як вас, але мене таке ходіння дістало б. Я б хотів якийсь термінал, у який вводиш потрібні дані, оплачуєш і тобі зразу персонал видає черевики, лижі, палки, абонемент на день і ключі до номеру в готелі (і дівчину у номер o_O). Якщо ж мені потрібен лише абонемент на день, а лижне спорядження я маю, то абонемент я купую на місці.

Фасад надає єдину «точку доступу» до підсистеми, тим самим спрощуючи її використання та розуміння.
В нашому прикладі Фасадом буде термінал-обслуговувальна станція (SkiResortFacade) а підсистемою є ціла купа прокатних будок, кас і готельних комплексів. Звичайно, ви можете прогулятися по курорту, якщо вам це подобається, але якщо дивитися із точки зору розробки програмного забезпечення, то якщо кожен собі буде «гуляти» куди хоче і як хоче, то до добра це не приведе, а лижники-новачки ніколи не будуть знати куди їм йти в першу чергу.

Уривок коду 10.1. Три системи, доступ до яких надається одним фасадом

 // 1. Система орендування черевиків
class SkiRent
{
    public int RentBoots(int feetSize, int skierLevel)
    {
        return 20;
    }
    public int RentSki(int weight, int skierLevel)
    {
        return 40;
    }
    public int RentPole(int height)
    {
        return 5;
    }
}


// 2. Система придбання квитків
class SkiResortTicketSystem
{
    public int BuyOneDayTicket()
    {
        return 115;
    }
    public int BuyHalfDayTicket()
    {
        return 60;
    }
}
// 3. Система бронювання місць в готелі
class HotelBookingSystem
{
    public int BookRoom(int roomQuality)
    {
        switch (roomQuality)
        {
            case 3:
                return 250;
            case 4:
                return 500;
            case 5:
                return 900;
            default:
                throw new ArgumentException(
                             "roomQuality should be in range [3;5]");
        }
    }
}
// Фасад, що надає єдиний доступ до всіх систем згаданих вище
class SkiResortFacade
{
    private SkiRent _skiRent = new SkiRent();
    private SkiResortTicketSystem _skiResortTicketSystem 
                                         = new SkiResortTicketSystem();
    private HotelBookingSystem _hotelBookingSystem = new HotelBookingSystem();
    // Беручи до уваги вхідні параметри бронює номер, підбирає лижі і т.д
    // Повертає загальну ціну за все
    public int HaveGoodRest(int height, int weight, int feetSize, int skierLevel,
                                                                 int roomQuality)
    {
            int skiPrice = _skiRent.RentSki(weight, skierLevel);
        int skiBootsPrice = _skiRent.RentBoots(feetSize, skierLevel);
        int polePrice = _skiRent.RentPole(height);
        int oneDayTicketPr = _skiResortTicketSystem.BuyOneDayTicket();
        int hotelPrice = _hotelBookingSystem.BookRoom(roomQuality);

        return skiPrice + skiBootsPrice + polePrice + oneDayTicketPr + hotelPrice;
    }
    // Інші методи можуть поєднувати виклики до інших систем
    public int HaveRestWithOwnSkis()
    {
        int oneDayTicketPrice = _skiResortTicketSystem.BuyOneDayTicket();
        return oneDayTicketPrice;
    }
    // Може бути що наш фасад-термінал просто огортає методи із усіх систем
}

Цей дизайн патерн можна розглядати як наступний рівень такого важливого принципу як інкапсуляція. Просто на цьому рівні ми інкапсулюємо цілу підсистему. Великі системи зазвичай здійснюють взаємозв’язок одна з одною за допомогою цього патерну. Космічна станція у космосі стикається з іншою за допомогою одного механізму, а не прикрученням сотні дротів поокремо. Також добрим тоном буде, якщо кожна із збірок, які ви пишете, має свого роду Фасад із відкритих класів та інтерфейсів, щоб цю збірку потім можна було легко використовувати із інших частин програми.

По матеріалам книги Андрія Будая "Дизайн патерни – просто, як двері". Матеріал розміщується за домовленістю з автором.
Робота представлена за умовами ліцензії Creative Commons Attribution-NonCommercial 3.0 Unported License.

загрузка...
Сторінки, близькі за змістом