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