Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Турчин Д.Е. - Архитектура ИС. Практикум 2014 (И...doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
5.42 Mб
Скачать

5.2.2. Шаблон Фасад Шаблон Фасад.

Важным структурным шаблоном GoF является Фасад (англ. Facade), который упрощает интерфейс отдельной подсистемы – группы взаимосвязанных классов или компонентов.

Фасад – структурный шаблон проектирования, позволяющий скрыть сложность подсистемы путем сведения всех возможных вызовов к одному объекту (фасадному объекту), делегирующему их объектам подсистемы.

Проблема.

Как обеспечить унифицированный интерфейс с подсистемой, если нежелательна высокая степень связанности с этой подсистемой или реализация подсистемы может измениться?

Решение.

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

Участники решения:

  • Client – взаимодействует с фасадом и не имеет доступа к классам подсистемы;

  • Facade – перенаправляет запросы клиентов к классам подсистемы;

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

Результаты.

  • Клиенты изолируются от классов (компонентов) подсистемы, что уменьшает число объектов, с которыми клиенты взаимодействуют, и упрощает работу с подсистемой.

  • Снижается степень связанности между клиентами и подсистемой, что позволяет изменять классы подсистемы, не затрагивая при этом клиентов.

Рис. 5.5. Диаграмма классов шаблона Фасад

Реализация шаблона Фасад на языке c#.

Простой пример реализации шаблона Фасад на языке C# представлен в листинге 5.1.

Листинг 5.7. Пример реализации шаблона Фасад на языке C#

namespace Subsystem // Содержит классы подсистемы

{

internal class ClassA

{

public string A1()

{

return "Метод A1() класса ClassA";

}

public string A2()

{

return "Метод A2() класса ClassA";

}

}

internal class ClassB

{

public string B1()

{

return "Метод B1() класса ClassB";

}

public string B2()

{

return "Метод B2() класса ClassB";

}

}

}

// Представляет фасадные объекты

public class Facade

{

Subsystem.ClassA a;

Subsystem.ClassB b;

public Facade()

{

a = new Subsystem.ClassA();

b = new Subsystem.ClassB();

}

public void F1()

{

Console.WriteLine("Метод F1() класса Facade:\n" +

"* {0}\n" +

"* {1}\n", a.A1(), b.B2());

}

public void F2()

{

Console.WriteLine("Метод F2() класса Facade:\n" +

"* {0}\n" +

"* {1}\n" +

"* {2}\n", a.A2(), b.B1(), b.B2());

}

}

// Клиент

class Client

{

static void Main(string[] args)

{

Facade facade = new Facade();

facade.F1();

facade.F2();

}

}

Пример 5.2. Реализация шаблона Фасад в приложении на языке C#.

Требуется разработать приложение по расчету максимального размера кредита. Приложение должно осуществлять расчет в зависимости от введенных пользователем данных и отображать результат расчета. Расчет может производиться различным образом для различных типов кредита (потребительский кредит, ипотечный кредит, автокредит).

В качестве параметров для выполнения расчета будут выступать:

  • средний ежемесячный доход;

  • срок кредитования;

  • наличие карты банка;

  • вид собственности в качестве залога (автомобиль, квартира, земельный участок);

  • размер непогашенных кредитов.

Предполагается, что процедура расчета взносов может меняться чаще, чем остальные элементы приложения. В этой ситуации может оказаться полезным использование шаблона Фасад, который должен обеспечивать доступ к различным процедурам расчета.

Для создания решения будем использовать следующие классы, размещаемые в отдельной библиотеке:

  • Credit – представляет банковские кредиты (абстрактный класс);

  • ConsumeCredit – представляет потребительские кредиты (производный от Credit);

  • EstateCredit – представляет ипотечные кредиты (производный от Credit);

  • CarCredit – представляет автокредиты (производный от Credit);

  • CreditFacade – представляет фасадные объекты (статический класс).

Для классов Credit, ConsumeCredit, EstateCredit, CarCredit зададим пакетный уровень доступа (модификатор internal в C#) и разместим их в отдельном пакете (пространстве имён) Credits. Для класса CreditFacade и его операций будем использовать открытый доступ.

Диаграмма классов проектируемого решения, созданная средствами Visual Studio, показана на рис. 5.6.

В качестве клиента для фасада будем использовать консольное приложение.

Рис. 5.6. Диаграмма классов решения

Исходный код абстрактного класса Credit представлен в листинге 5.8, а код производного от него класса ConsumeCredit – в листинге 5.9.

Исходный код статического класса CreditFasade приведён в листинге 5.10.

Листинг 5.8. Исходный код класса Credit

Листинг 5.9. Исходный код класса ConsumeCredit

Листинг 5.10. Исходный код класса CreditFacade (часть 1)

Листинг 5.10. Исходный код класса CreditFacade (часть 2)

Исходный код класса Program консольного приложения представлен в листинге 5.11.

Листинг 5.11. Исходный код класса Program консольного приложения (клиент)

Результат работы консольного приложения показан на рис. 5.6. ❒

Рис. 5.6. Результат работы приложения