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

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск
(Другое название)
(Назначение)
 
(не показано 10 промежуточных версий этого же участника)
Строка 2: Строка 2:
 
__NOTOC__
 
__NOTOC__
 
=== Назначение ===
 
=== Назначение ===
 +
Предоставляет простой интерфейс к большой системе, которая обычно представляет множество взаимосвязанных классов.
  
 
=== Описание ===
 
=== Описание ===
 +
Разбиение на подсистемы и сведение к минимуму зависимостей подсистем - цель любого проектирования. Один из способов решения этой задачи - представление объекта Фасад, предоставляющего единый упрощенный интерфейс
 +
к сложной системе.
 +
=== Использование===
 +
Паттерн Фасад используется:
 +
* когда требуется предоставить простой интерфейс к сложной подсистеме
 +
* когда необходимо отделить подсистему от клиентов, повышая переносимость
 +
* когда требуется разбить подсистему на слои. Если подсистемы зависят друг от друга, то можно разрешить им обмениваться информацией только через фасады
  
 
=== Реализация ===
 
=== Реализация ===
 
==== Диаграмма классов ====
 
==== Диаграмма классов ====
[[Изображение:Common.png]]
+
[[Изображение:FacadeCommon.png]]
  
 
==== Участники====
 
==== Участники====
*  
+
* '''Facade''' - фасад
 +
Знает, каким классам подсистемы адресовать запрос
 +
Делегирует запросы клиентов подходящим объектам внутри подсистемы
 +
 
 +
* '''Классы подсистемы'''
 +
* Реализуют функциональность подсистемы
 +
* Выполняют работу, порученную объекту Facade
 +
* Ничего не знают о существовании фасада
  
 
=== Пример ===
 
=== Пример ===
 
<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 можно сделать абстрактным. Его конкретные подклассы будут соответствовать различным реализациям подсистемы
  • Несколько подсистем взаимодействуют только своими фасадами