Библиотеки-обертки (или библиотеки-обертки ) состоят из тонкого слоя кода (« прокладки »), который переводит существующий интерфейс библиотеки в совместимый интерфейс. Это делается по нескольким причинам:
Библиотеки-обертки могут быть реализованы с использованием шаблонов проектирования адаптера , фасада и, в меньшей степени, прокси- шаблонов .
Конкретный способ реализации библиотеки-обертки очень специфичен для среды, в которой она пишется, и сценариев, которые она должна решать. Это особенно верно в случае, когда рассматривается кросс-языковая/средовая совместимость.
Ниже представлена общая иллюстрация реализации библиотеки-обертки. В этом примере интерфейс C++ действует как «обертка» вокруг интерфейса C.
int pthread_mutex_init ( pthread_mutex_t * мьютекс , pthread_mutexattr_t * атрибут ); int pthread_mutex_destroy ( pthread_mutex_t * мьютекс ) ; int pthread_mutex_lock ( pthread_mutex_t * мьютекс ); int pthread_mutex_unlock ( pthread_mutex_t * мьютекс );
класс Мьютекс { pthread_mutex_t мьютекс ; public : Mutex () { pthread_mutex_init ( & mutex , 0 ); } ~ Мьютекс () { pthread_mutex_destroy ( & мьютекс ); } частный : класс друга Lock ; void lock () { pthread_mutex_lock ( & мьютекс ); } void unlock () { pthread_mutex_unlock ( & mutex ); } }; класс Lock { частный : Мьютекс & мьютекс ; public : Lock ( Mutex & mutex ) : mutex { mutex } { mutex . lock (); } ~ Блокировка () { мьютекс . разблокировка (); } };
Исходный интерфейс C можно считать подверженным ошибкам, особенно в случае, когда пользователи библиотеки забывают разблокировать уже заблокированный мьютекс. Новый интерфейс эффективно использует получение ресурсов и инициализацию (RAII) в новых классах Mutex и Lock , чтобы гарантировать, что Mutex в конечном итоге будут разблокированы, а объекты pthread_mutex_t будут автоматически освобождены.
Приведенный выше код точно имитирует реализацию boost::scoped_lock и boost::mutex , которые являются частью библиотеки boost::thread.
Некоторые библиотеки-обертки существуют для того, чтобы выступать в качестве моста между клиентским приложением и библиотекой, написанной с использованием несовместимой технологии. Например, приложению Java может потребоваться выполнить системный вызов . Однако системные вызовы обычно представляются как функции библиотеки C. Для решения этой проблемы Java реализует библиотеки-обертки, которые делают эти системные вызовы доступными для вызова из приложения Java.
Чтобы достичь этого, такие языки, как Java, предоставляют механизм, называемый интерфейсом внешней функции , который делает это возможным. Вот некоторые примеры таких механизмов:
Некоторые примеры существующих библиотек-оболочек: