Паттерн "Bridge" (мост)
Логгер как система протоколирования сообщений, фиксирующая ошибки, отладочную и другую информацию в процессе выполнения программы. Назначение, достоинства и недостатки в системе, спроектированной с применением паттерна Bridge, мотивация его использования.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | реферат |
Язык | русский |
Дата добавления | 20.05.2014 |
Размер файла | 67,9 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Южный Федеральный Университет
Факультет математики, механики и компьютерных наук
Паттерн «Bridge» (мост)
Выполнил студент 3 курса 1 группы
Лаздин Д.А.
Май 2014
Паттерн Bridge (мост, идиома "Handle/Body")
Относится к структурным паттернам.
Назначение паттерна Bridge
В системе могут существовать классы, отношения между которыми строятся в соответствии со следующей объектно-ориентированной иерархией: абстрактный базовый класс объявляет интерфейс, а конкретные подклассы реализуют его нужным образом. Такой подход является стандартным в ООП, однако, ему свойственны следующие недостатки:
1. Система, построенная на основе наследования, является статичной. Реализация жестко привязана к интерфейсу. Изменить реализацию объекта некоторого типа в процессе выполнения программы уже невозможно.
2. Система становится трудно поддерживаемой, если число родственных производных классов становится большим.
Поясним сложности расширения системы новыми типами на примере разработки логгера. Логгер это система протоколирования сообщений, позволяющая фиксировать ошибки, отладочную и другую информацию в процессе выполнения программы. Разрабатываемый нами логгер может использоваться в одном из трех режимов: выводить сообщения на экран, в файл или отсылать их на удаленный компьютер. Кроме того, необходимо обеспечить возможность его применения в одно- и многопоточной средах.
Стандартный подход на основе полиморфизма использует следующую иерархию классов. логгер протоколирование паттерн программа
Видно, что число родственных подклассов в системе равно 6. Добавление еще одного вида логгера увеличит его до 8, двух - до 10 и так далее. Система становится трудно управляемой.
Указанные недостатки отсутствует в системе, спроектированной с применением паттерна Bridge.
Описание паттерна Bridge
Паттерн Bridge разделяет абстракцию и реализацию на две отдельные иерархии классов так, что их можно изменять независимо друг от друга.
Первая иерархия определяет интерфейс абстракции, доступный пользователю. Для случая проектируемого нами логгера абстрактный базовый класс Logger мог бы объявить интерфейс метода log() для вывода сообщений. Класс Logger также содержит указатель на реализацию pimpl, который инициализируется должным образом при создании логгера конкретного типа. Этот указатель используется для перенаправления пользовательских запросов в реализацию. Заметим, в общем случае подклассы ConsoleLogger, FileLogger и SocketLogger могут расширять интерфейс класса Logger.
Все детали реализации, связанные с особенностями среды скрываются во второй иерархии. Базовый класс LoggerImpl объявляет интерфейс операций, предназначенных для отправки сообщений на экран, файл и удаленный компьютер, а подклассы ST_LoggerImpl и МT_LoggerImpl его реализуют для однопоточной и многопоточной среды соответственно. В общем случае, интерфейс LoggerImpl необязательно должен в точности соответствовать интерфейсу абстракции. Часто он выглядит как набор низкоуровневых примитивов.
Паттерн Bridge позволяет легко изменить реализацию во время выполнения программы. Для этого достаточно перенастроить указатель pimpl на объект-реализацию нужного типа. Применение паттерна Bridge также позволяет сократить общее число подклассов в системе, что делает ее более простой в поддержке.
Мотивация использования Bridge
Недостаточная гибкость стандартного метода реализации (интерфейс + наследование):
?Наследование жёстко привязывает реализацию к интерфейсам - поэтому, если нужно поменять интерфейс, придётся изменить всех наследников.
?При создании более «специализированного» интерфейса потребуется создание большого числа классов в рамках одной иерархии.
В каких ситуациях используется Bridge
1.Требуется избежать постоянной привязки абстракции к реализации. Так, например, бывает, когда реализацию необходимо выбирать во время выполнения программы (мой пример)
2.Если и абстракции(интерфейсы) и реализации должны расширяться новыми подклассами. В этом случае «мост» позволяет комбинировать разные интерфейсы и реализации и изменять их независимо.
3.Изменения в реализации не должны сказываться на клиентах. То есть клиентский код не должен перекомпилироваться.
4.Требуется полностью скрыть от клиентов реализацию интерфейса.
5.Если число классов в рамках одной иерархии велико, паттерн «мост» используется для разбивание одной большой и запутанной иерархии на две.
6.Требуется разделить одну реализацию между несколькими объектами и, этот факт необходимо скрыть от клиента.
Структура паттерна Bridge
UML-диаграмма классов паттерна Bridge
Паттерны Bridge и Adapter имеют схожую структуру, однако, цели их использования различны. Если паттерн Adapter применяют для адаптации уже существующих классов в систему, то паттерн Bridge используется на стадии ее проектирования.
Реализация паттерна Bridge
Приведем реализацию логгера с применением паттерна Bridge.
// Logger.h - Абстракция
#include <string>
// Опережающее объявление
class LoggerImpl;
class Logger
{
public:
Logger( LoggerImpl* p );
virtual ~Logger( );
virtual void log( string & str ) = 0;
protected:
LoggerImpl * pimpl;
};
class ConsoleLogger : public Logger
{
public:
ConsoleLogger();
void log( string & str );
};
class FileLogger : public Logger
{
public:
FileLogger( string & file_name );
void log( string & str );
private:
string file;
};
class SocketLogger : public Logger
{
public:
SocketLogger( string & remote_host, int remote_port );
void log( string & str );
private:
string host;
int port;
};
// Logger.cpp - Абстракция
#include "Logger.h"
#include "LoggerImpl.h"
Logger::Logger( LoggerImpl* p ) : pimpl(p) { }
Logger::~Logger( ) {delete pimpl; }
ConsoleLogger::ConsoleLogger() : Logger(
#ifdef MT
new MT_LoggerImpl()
#else
new ST_LoggerImpl()
#endif
)
{ }
void ConsoleLogger::log( string & str )
{
pimpl->console_log( str);
}
FileLogger::FileLogger( string & file_name ) : Logger(
#ifdef MT
new MT_LoggerImpl()
#else
new ST_LoggerImpl()
#endif
), file(file_name)
{ }
void FileLogger::log( string & str )
{
pimpl->file_log( file, str);
}
SocketLogger::SocketLogger( string & remote_host,
int remote_port ) : Logger(
#ifdef MT
new MT_LoggerImpl()
#else
new ST_LoggerImpl()
#endif
), host(remote_host), port(remote_port)
{ }
void SocketLogger::log( string & str )
{
pimpl->socket_log( host, port, str);
}
// LoggerImpl.h - Реализация
#include <string>
class LoggerImpl
{
public:
virtual ~LoggerImpl( ) {}
virtual void console_log( string & str ) = 0;
virtual void file_log(
string & file, string & str ) = 0;
virtual void socket_log(
tring & host, int port, string & str ) = 0;
};
class ST_LoggerImpl : public LoggerImpl
{
public:
void console_log( string & str );
void file_log ( string & file, string & str );
void socket_log (
string & host, int port, string & str );
};
class MT_LoggerImpl : public LoggerImpl
{
public:
void console_log( string & str );
void file_log ( string & file, string & str );
void socket_log (
string & host, int port, string & str );
};
// LoggerImpl.cpp - Реализация
#include <iostream>
#include "LoggerImpl.h"
void ST_LoggerImpl::console_log( string & str )
{
cout << "Single-threaded console logger" << endl;
}
void ST_LoggerImpl::file_log( string & file, string & str )
{
cout << "Single-threaded file logger" << endl;
}
void ST_LoggerImpl::socket_log(
string & host, int port, string & str )
{
cout << "Single-threaded socket logger" << endl;
};
void MT_LoggerImpl::console_log( string & str )
{
cout << "Multithreaded console logger" << endl;
}
void MT_LoggerImpl::file_log( string & file, string & str )
{
cout << "Multithreaded file logger" << endl;
}
void MT_LoggerImpl::socket_log(
string & host, int port, string & str )
{
cout << "Multithreaded socket logger" << endl;
}
// Main.cpp
#include <string>
#include "Logger.h"
int main()
{
Logger * p = new FileLogger( string("log.txt"));
p->log( string("message"));
delete p;
return 0;
}
Отметим несколько важных моментов приведенной реализации паттерна Bridge:
1. При модификации реализации клиентский код перекомпилировать не нужно. Использование в абстракции указателя на реализацию (идиома pimpl) позволяет заменить в файле Logger.h включение include "LoggerImpl.h" на опережающее объявление class LoggerImpl. Такой прием снимает зависимость времени компиляции файла Logger.h (и, соответственно, использующих его файлов клиента) от файла LoggerImpl.h.
2. Пользователь класса Logger не видит никаких деталей его реализации.
Достоинства и недостатки паттерна Bridge
Достоинства паттерна Bridge
· Проще расширять систему новыми типами за счет сокращения общего числа родственных подклассов.
· Возможность динамического изменения реализации в процессе выполнения программы.
· Паттерн Bridge полностью скрывает реализацию от клиента. В случае модификации реализации пользовательский код не требует перекомпиляции.
Недостатки паттерна Bridge
· Создаётся «посредник» между клиентом и выполняемым кодом;
· Лишние вычисления для определения конкретной реализации или её возможной замены;
· У клиента нет доступа к реализаторам;
Известные применения паттерна Bridge
В библиотеке libg++ определены классы, которые реализуют универсальные структуры данных: Set (множество), LinkedSet (множество как связанный список), HashSet (множество как хэш-таблица), LinkedList (связанный список) и HashTable (хэш-таблица). Set - это абстрактный класс, определяющий абстракцию множества, a LinkedList и HashTable - конкретные реализации связанного списка и хэш-таблицы. LinkedSet и HashSet - реализаторы абстракции Set, перекидывающие мост между Set и LinkedList и HashTable соответственно. Перед вами пример вырожденного моста, поскольку абстрактного класса Implementor здесь нет.
В библиотеке NeXT AppKit паттерн мост используется при реализации и отображении графических изображений. Рисунок может быть представлен по-разному. Оптимальный способ его отображения на экране зависит от свойств дисплея и прежде всего от числа цветов и разрешения. Если бы не AppKit, то для каждого приложения разработчикам пришлось бы самостоятельно выяснять, какой реализацией пользоваться в конкретных условиях.
AppKit предоставляет мост NXImage/NXImageRep. Класс NXImage определяет интерфейс для обработки изображений. Реализация же определена в отдельной иерархии классов NXImageRep, в которой есть такие подклассы, как NXEPSImageRep, NXCachecImageRep и NXBitMapImageRep. В классе NXImage хранятся ссылки на один или более объектов NXImageRep. Если имеется более одной реализации изображения, то NXImage выбирает самую подходящую для данного дисплея. При
необходимости NXImage также может преобразовать изображение из одного формата в другой. Интересная особенность этого варианта моста в том, что NXImage может одновременно хранить несколько реализаций NXImageRep.
Родственные паттерны Bridge
Мост часто используется с «абстрактной фабрикой». Она сама способна создать и сконфигурировать мост.
Наиболее похож на «мост» паттерн «адаптер», но он, в отличии от «моста» чаще применяется уже в готовых системах. «Мост» же участвует в проекте с самого начала и призван поддержать возможность независимого изменения абстракций и их реализаций.
Размещено на Allbest.ru
...Подобные документы
Взаємодія шин в типовому комп'ютері на базі процесора Pentium. Основні блоки набору мікросхем системної логіки: North Bridge, South Bridge та Super I/O. Набори мікросхем системної інформації для різних поколінь процесорів та їх технічні характеристики.
реферат [297,1 K], добавлен 19.06.2010Исследование приемов объектно-ориентированного проектирования. Описания паттернов поведения, предназначенных для распределения обязанностей между объектами в системе. Признаки применения, использования паттерна "Декоратор". Принцип действия репозитория.
реферат [686,9 K], добавлен 21.09.2013Электронные базы данных по действующему законодательству. Классификация справочно-правовых систем: "КонсультантПлюс", "Гарант", профессиональная юридическая "Кодекс" и экспертная "Дельта". Особенности, интерфейс, достоинства и недостатки программы Dbase.
отчет по практике [54,7 K], добавлен 14.03.2012Принципы и техники коммутации пакетов, каналов и сообщений. Перспективы их использования. Достоинства и недостатки данных сетевых технологий. Проблема адресации сетевых интерфейсов компьютеров. Требования, предъявляемые к адресу и схеме его назначения.
реферат [20,7 K], добавлен 26.11.2012Изучение программы "SpeedCommander 12.01.5170" - файлового менеджера с многочисленными и уникальными возможностями по работе с файлами. Установка, запуск и настройка программы, ее назначение и описание. Сравнение с аналогами, достоинства и недостатки.
курсовая работа [4,5 M], добавлен 11.09.2010Назначение и принцип работы программы Spider player 2.011, перечень ее разработчиков, достоинства, недостатки, а также сравнение с предыдущими ее версиями и аналогами. Общая характеристика основных версий программы. Назначение основных кнопок проигрывате
курсовая работа [1,1 M], добавлен 18.06.2010Разработка программы с использованием языка программирования Pascal для выполнения алгебраических действий с действительными числами без знака в шестнадцатеричной системе счисления. Описание хода выполнения, схема алгоритма, листинг программы, ее функции.
реферат [687,5 K], добавлен 28.10.2011Примеры правила перевода чисел с одной системы в другую, правила и особенности выполнения арифметических операций в двоичной системе счисления. Перевод числа с десятичной системы в двоичную систему счисления. Умножение целых чисел в двоичной системе.
контрольная работа [37,3 K], добавлен 13.02.2009Создание электронной системы, способной передавать и принимать файлы, содержащие определённую информацию, с одного компьютера на другой и вести учёт отправленных и входящих файлов. Структурные и функциональные схемы, используемые процедуры и функции.
курсовая работа [1,4 M], добавлен 11.01.2013Обработка прерываний - сигналов о совершении некоторых событий в компьютере. Механизм обработки прерываний. Обработка исключений, описание реакции программы на ошибки выполнения. Общее понятие и виды исключительных ситуаций во время выполнения программы.
реферат [192,2 K], добавлен 10.11.2014Требования, предъявленные к полноценному локальному чату. Протокол передачи данных TCP. Описание программы сервера. Этапы разработки программного продукта. Функция приема сообщений от сервера. Принятие и отправка сообщений всем пользователям чата.
курсовая работа [447,0 K], добавлен 21.01.2016Стадии разработки программного средства. Средства, методологии и методы его разработки. Оценка надежности и качества проекта. Обоснование необходимости разработки программы. Тестирование как процесс выполнения тестовой программы с намерением найти ошибки.
презентация [57,0 K], добавлен 27.12.2013Понятие шаблона проектирования или паттерна в разработке программного обеспечения. Изменение поведения системы (базы данных) с помощью порождающего шаблона программирования - абстрактной фабрики. Программирование базы данных и управление ею на языке С+.
курсовая работа [124,8 K], добавлен 30.04.2011Функциональная структура информационной системы предприятия, достоинства, недостатки, перспективы ее развития. Типы ИС с учетом уровней управления и квалификации персонала. Требования к автоматизированной системе, сущность подсистемы управления финансами.
контрольная работа [740,2 K], добавлен 25.07.2010Первичные компоненты, использовавшиеся в системных платах персонального компьютера. Архитектура чипсетов Intel на примере North/South Bridge. Интерфейс между процессором и остальной частью системной платы. Современные чипсеты Intel, их структурная схема.
презентация [2,0 M], добавлен 27.08.2013Применение программного обеспечения для разработки игры "Быки и коровы". Описание алгоритма и интерфейса пользователя программы. Назначение и область применения и описание возможностей программы. Рассмотрение списка сообщений об ошибках программы.
курсовая работа [799,2 K], добавлен 26.04.2021Операционная система – набор программ, обеспечивающий организацию вычислительного процесса на ЭВМ, ее значение, структура, функции, история развития. Альтернативы Windows: UNIX, Linux, OS/2, MacOS, главные их достоинства и недостатки, сферы использования.
реферат [41,4 K], добавлен 28.03.2010Анализ программы "Проводник". Понятие операционной системы (ОС). Достоинства и недостатки файловых систем. Исследование методов запуска программы "Проводник", работа с файловой структурой в программе "Проводник" ОС Windows. Приемы работы с объектами.
курсовая работа [32,7 K], добавлен 13.09.2009Принцип работы и назначение сервлетов Java, их значение в повышении функциональности Web-серверов и улучшении их программирования, преимущества и недостатки использования. Способы вызова сервлетов с браузера и страницы. Запись и чтение атрибутов сессии.
лабораторная работа [80,2 K], добавлен 30.06.2009Разработка программы FileInfo, выдающей полную информацию о заданном файле с применением языка программирования С++, используя API функции Win 32. Использование пространств имён .NetFramework. Руководство пользователя и системные требования программы.
курсовая работа [1,2 M], добавлен 25.04.2012