Фасад (Facade) — различия между версиями
Материал из Вики ИТ мехмата ЮФУ
Admin (обсуждение | вклад) (Новая страница: « К основной странице курса __NOTOC__ === Другое назв…») |
Admin (обсуждение | вклад) (→Назначение) |
||
(не показано 11 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
[[Страница_курса_Паттерны_проектирования| К основной странице курса]] | [[Страница_курса_Паттерны_проектирования| К основной странице курса]] | ||
__NOTOC__ | __NOTOC__ | ||
− | |||
=== Назначение === | === Назначение === | ||
+ | Предоставляет простой интерфейс к большой системе, которая обычно представляет множество взаимосвязанных классов. | ||
=== Описание === | === Описание === | ||
+ | Разбиение на подсистемы и сведение к минимуму зависимостей подсистем - цель любого проектирования. Один из способов решения этой задачи - представление объекта Фасад, предоставляющего единый упрощенный интерфейс | ||
+ | к сложной системе. | ||
+ | === Использование=== | ||
+ | Паттерн Фасад используется: | ||
+ | * когда требуется предоставить простой интерфейс к сложной подсистеме | ||
+ | * когда необходимо отделить подсистему от клиентов, повышая переносимость | ||
+ | * когда требуется разбить подсистему на слои. Если подсистемы зависят друг от друга, то можно разрешить им обмениваться информацией только через фасады | ||
=== Реализация === | === Реализация === | ||
==== Диаграмма классов ==== | ==== Диаграмма классов ==== | ||
− | [[Изображение: | + | [[Изображение: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
Назначение
Предоставляет простой интерфейс к большой системе, которая обычно представляет множество взаимосвязанных классов.
Описание
Разбиение на подсистемы и сведение к минимуму зависимостей подсистем - цель любого проектирования. Один из способов решения этой задачи - представление объекта Фасад, предоставляющего единый упрощенный интерфейс к сложной системе.
Использование
Паттерн Фасад используется:
- когда требуется предоставить простой интерфейс к сложной подсистеме
- когда необходимо отделить подсистему от клиентов, повышая переносимость
- когда требуется разбить подсистему на слои. Если подсистемы зависят друг от друга, то можно разрешить им обмениваться информацией только через фасады
Реализация
Диаграмма классов
Участники
- 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 можно сделать абстрактным. Его конкретные подклассы будут соответствовать различным реализациям подсистемы
- Несколько подсистем взаимодействуют только своими фасадами