Материалы книги получены с http://www.itlibitum.ru/
Посредники
Интерфейсные указатели также помогают скрыть тот факт, что указываемый объект находится где-то в киберпространстве, а не сидит в памяти по соседству. В распределенных объектных системах такое происходит сплошь и рядом. Первая цель проектировщика - держать клиентские объекты в блаженном неведении; они не знают и знать не хотят, где находится указываемый объект - на расстоянии плевка или где-то на краю земли. Объект, который заменяет другой, удаленный объект, называется посредником (proxy). На эту тему тоже существует немало вариаций, но самая простая из
них - локальное использование интерфейсного объекта или грани. Затем локальный посредник может воспользоваться дистанционными вызовами или другим механизмом отправки сообщений, подходящим для взаимодействия с оригиналом.
Эта концепция распространяется и на ситуации, в которых удаленный «объект» вообще не является объектом. Это может быть целое приложение, завернутое посредником в объектно-ориентированную оболочку, или, допустим, содержимое базы данных с библиотечными функциями «класса».
В самой идее внедрения «не объектно-ориентированного» кода в объекты С++ нет ничего нового или оригинального. Нас в первую очередь интересует уровень инкапсуляции. Что должен знать клиент о реальной ситуации? Умные указатели на основе операторов -> подходят плохо. Клиент должен знать интерфейс указываемого объекта; следовательно, он должен знать, существует ли указываемый объект, как устроен его интерфейс и т. д. Интерфейсные указатели, в том числе грани - более удачный вариант. Если ваша программа написана с применением интерфейсных указателей, вам будет намного
проще вставить новый код, в котором некоторые из этих указателей реализуются в виде посредников.
Проще, хотя и не совсем незаметно для клиента - пока. Помните базовую форму интерфейсного указателя с обязательным предварительным объявлением?
class Pointee; // Предварительное объявление
class Interface {
private:
Pointee* pointee;
public:
// Функции класса
};
Проблема кроется в переменной pointee. Клиент должен знать, что указатель ссылается на нечто, даже если он понятия не имеет, на что именно. В части 3 мы попробуем устранить даже это ограничение, а пока будем считать его досадной мелочью.
В результате мы приходим к классическому компромиссу: понижение быстродействия интерфейсных указателей (с вынесенными (outline) функциями) за возможность кардинальных изменений реализации без модификации клиентского кода. В большинстве проектов и классов расходы с лихвой компенсируются ускорением цикла разработки.
Назад Содержание Далее
|