Фасад (Facade) — различия между версиями

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск
(Участники)
(Назначение)
 
(не показаны 4 промежуточные версии этого же участника)
Строка 7: Строка 7:
 
Разбиение на подсистемы и сведение к минимуму зависимостей подсистем - цель любого проектирования. Один из способов решения этой задачи - представление объекта Фасад, предоставляющего единый упрощенный интерфейс  
 
Разбиение на подсистемы и сведение к минимуму зависимостей подсистем - цель любого проектирования. Один из способов решения этой задачи - представление объекта Фасад, предоставляющего единый упрощенный интерфейс  
 
к сложной системе.
 
к сложной системе.
=== Назначение ===
+
=== Использование===
 
Паттерн Фасад используется:
 
Паттерн Фасад используется:
 
* когда требуется предоставить простой интерфейс к сложной подсистеме
 
* когда требуется предоставить простой интерфейс к сложной подсистеме
Строка 29: Строка 29:
 
=== Пример ===
 
=== Пример ===
 
<source lang="Csharp">
 
<source lang="Csharp">
 +
class MainApp
 +
{
 +
    public static void Main()
 +
    {
 +
        Facade facade = new Facade();
 +
 +
        facade.MethodA();
 +
        facade.MethodB();
 +
    }
 +
}
 +
 +
class SubSystemOne
 +
{
 +
    public void MethodOne()
 +
    {
 +
        Console.WriteLine(" SubSystemOne Method");
 +
    }
 +
}
 +
 +
class SubSystemTwo
 +
{
 +
    public void MethodTwo()
 +
    {
 +
        Console.WriteLine(" SubSystemTwo Method");
 +
    }
 +
}
 +
 +
class SubSystemThree
 +
{
 +
    public void MethodThree()
 +
    {
 +
        Console.WriteLine(" SubSystemThree Method");
 +
    }
 +
}
 +
 +
class Facade
 +
{
 +
    SubSystemOne one;
 +
    SubSystemTwo two;
 +
    SubSystemThree three;
 +
 +
    public Facade()
 +
    {
 +
        one = new SubSystemOne();
 +
        two = new SubSystemTwo();
 +
        three = new SubSystemThree();
 +
    }
 +
 +
    public void MethodA()
 +
    {
 +
        Console.WriteLine("\nMethodA() ---- ");
 +
        one.MethodOne();
 +
        two.MethodTwo();
 +
    }
 +
 +
    public void MethodB()
 +
    {
 +
        Console.WriteLine("\nMethodB() ---- ");
 +
        two.MethodTwo();
 +
        three.MethodThree();
 +
    }
 +
}
 
</source>
 
</source>
  
 
=== Достоинства и недостатки ===
 
=== Достоинства и недостатки ===
*  
+
* Изолирует клиентов от компонентов подсистемы
 +
* Позволяет ослабить связность между подсистемой и ее клиентами
  
 
=== Варианты ===
 
=== Варианты ===
*
+
* Класс Facade можно сделать абстрактным. Его конкретные подклассы будут соответствовать различным реализациям подсистемы
 +
* Несколько подсистем взаимодействуют только своими фасадами

Текущая версия на 14:17, 27 августа 2014

К основной странице курса

Назначение

Предоставляет простой интерфейс к большой системе, которая обычно представляет множество взаимосвязанных классов.

Описание

Разбиение на подсистемы и сведение к минимуму зависимостей подсистем - цель любого проектирования. Один из способов решения этой задачи - представление объекта Фасад, предоставляющего единый упрощенный интерфейс к сложной системе.

Использование

Паттерн Фасад используется:

  • когда требуется предоставить простой интерфейс к сложной подсистеме
  • когда необходимо отделить подсистему от клиентов, повышая переносимость
  • когда требуется разбить подсистему на слои. Если подсистемы зависят друг от друга, то можно разрешить им обмениваться информацией только через фасады

Реализация

Диаграмма классов

FacadeCommon.png

Участники

  • Facade - фасад

Знает, каким классам подсистемы адресовать запрос Делегирует запросы клиентов подходящим объектам внутри подсистемы

  • Классы подсистемы
  • Реализуют функциональность подсистемы
  • Выполняют работу, порученную объекту Facade
  • Ничего не знают о существовании фасада

Пример

class MainApp
{
    public static void Main()
    {
        Facade facade = new Facade();

        facade.MethodA();
        facade.MethodB();
    }
}

class SubSystemOne
{
    public void MethodOne()
    {
        Console.WriteLine(" SubSystemOne Method");
    }
}

class SubSystemTwo
{
    public void MethodTwo()
    {
        Console.WriteLine(" SubSystemTwo Method");
    }
}

class SubSystemThree
{
    public void MethodThree()
    {
        Console.WriteLine(" SubSystemThree Method");
    }
}

class Facade
{
    SubSystemOne one;
    SubSystemTwo two;
    SubSystemThree three;

    public Facade()
    {
        one = new SubSystemOne();
        two = new SubSystemTwo();
        three = new SubSystemThree();
    }

    public void MethodA()
    {
        Console.WriteLine("\nMethodA() ---- ");
        one.MethodOne();
        two.MethodTwo();
    }

    public void MethodB()
    {
        Console.WriteLine("\nMethodB() ---- ");
        two.MethodTwo();
        three.MethodThree();
    }
}

Достоинства и недостатки

  • Изолирует клиентов от компонентов подсистемы
  • Позволяет ослабить связность между подсистемой и ее клиентами

Варианты

  • Класс Facade можно сделать абстрактным. Его конкретные подклассы будут соответствовать различным реализациям подсистемы
  • Несколько подсистем взаимодействуют только своими фасадами