Заместители и заглушки
Как же во время выполнения удается удовлетворить различные требования различных контекстов? Когда какой-нибудь объект располагается в другом контексте (например, объект HotelBroker в экземпляре NewResevation), взамен указателя непосредственно на сам объект, возвращается указатель на некоторый заместитель. Реальный объект постоянно находится в своем первоначальном контексте. Заместитель – объект, который представляет первоначальный объект в другом контексте. Статический метод Remoting-Services::IsTransparentProxy определяет, на что ссылается указатель: на реальный объект или на заместитель. Рассмотрим код в Threading.h на шаге 4 проекта TestThreading:
bool bTrans; // логическая булева переменная bTrans bTrans = RemotingServices::IsTransparentProxy( customers); // клиенты Console::WriteLine ( "Is the customer object a proxy? {0}", // "Объект Клиент представляет заместитель? {0}", bTrans.ToString()); bTrans = RemotingServices::IsTransparentProxy( hotelBroker); Console::WriteLine( "Is the bookings object a proxy? {0}", // "Заказывает заместитель? {0}", bTrans.ToString());
Этот код генерирует следующую выдачу:
Is the customer object a proxy? False Is the bookings object a proxy? True
Перевод такой:
Объект Клиент представляет заместитель? Ложь Заказывает заместитель? Истина
При запуске программа выполняется в определенном по умолчанию контексте. Все объекты, такие как Customers (Клиенты), не предъявляющие специальных требований, создаются внутри этого контекста (контекст 0). Какой-нибудь объект, такой как HotelBroker с другими требованиями к синхронизации, создается в другом контексте (контекст 1), а заместитель возвращается в контекст 0.
Теперь, запрашивая метод MakeReservation объекта HotelBroker, мы реально получаем доступ к методу заместителя. Метод заместителя может потом применить замок синхронизации и затем делегировать функции методу реального объекта HotelBroker. Метод настоящего объекта возвращает управление заместителю. А заместитель может тогда удалить замок синхронизации и возвратить управление вызвавшей его программе. Такая технология, когда во время выполнения используются заместители для перехвата вызовов методов реальных объектов, называется перехватыванием.
Можно также просмотреть подобный пример под названием MarshalByReference в папке с примерами. Он показывает различные способы создания объекта и эффект от создания заместителя.