Декоратор BlockingQueue, который регистрирует удаленные объекты - PullRequest
4 голосов
/ 21 мая 2010

У меня есть реализация BlockingQueue, которая используется в ситуации производитель-потребитель. Я хотел бы украсить эту очередь, чтобы каждый взятый из нее объект регистрировался. Я знаю, как будет выглядеть простая реализация: просто внедрите BlockingQueue и примите BlockingQueue в конструкторе, которому делегируются все методы. Есть ли другой способ, по которому я скучаю? Библиотека что ли? Что-то с интерфейсом обратного вызова?

Ответы [ 2 ]

2 голосов
/ 21 мая 2010

Я бы подумал, что было бы проще создать класс, который расширяет соответствующий класс реализации для интерфейса BlockingQueue и переопределяет метод remove и другие по мере необходимости.

EDIT

Создание обертки - лучшая реализация, если в OP используется более одной реализации BlockingQueue, но при этом возникает незначительное снижение производительности при всех операциях и другие незначительные проблемы.

Я хочу сказать, что расширение класса очереди является альтернативой его переносу. Является ли это лучшей альтернативой, зависит от обстоятельств.

1 голос
/ 21 мая 2010

Альтернативой, которую вы можете рассмотреть, является динамические прокси . Это позволяет использовать API в стиле отражения для обработки запросов, сделанных для данного интерфейса - было бы очень просто делегировать все вызовы базовой реализации, добавив при этом некоторую логику регистрации, если имя метода совпадает с одним из методов take.

Недостаток этого подхода состоит в том, что он добавляет немного дополнительной служебной информации ко всем вызовам методов (почти наверняка пренебрежимо мал для общего использования, хотя это должен быть желтый флаг, если используется в разделе, критичном к производительности), и код может завершиться выглядит громоздким. В конечном итоге вы определяете точно такое же поведение, которое вы описываете в своем посте, за исключением того, что вам не нужно явно писать каждый делегирующий метод, а предоставлять своего рода подстановочную реализацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...