1 回答

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超4個(gè)贊
要將監(jiān)聽器添加到隊(duì)列中,您需要使其“可監(jiān)聽”,最簡(jiǎn)單的方法是裝飾器模式。此模式的目標(biāo)是在類中添加特性,同時(shí)保留其基本功能。
在 的情況下Queue
,您只需擴(kuò)展一個(gè)AbstractQueue
類,覆蓋它的offer
方法。其他方法只是委托給后備隊(duì)列,因?yàn)樗鼈儾恍枰ㄖ獋陕犉鳌?/p>
public class ListenableQueue<E> extends AbstractQueue<E> {
interface Listener<E> {
void onElementAdded(E element);
}
private final Queue<E> delegate; // backing queue
private final List<Listener<E>> listeners = new ArrayList<>();
public ListenableQueue(Queue<E> delegate) {
this.delegate = delegate;
}
public ListenableQueue<E> registerListener(Listener<E> listener) {
listeners.add(listener);
return this;
}
@Override
public boolean offer(E e) {
// here, we put an element in the backing queue,
// then notify listeners
if (delegate.offer(e)) {
listeners.forEach(listener -> listener.onElementAdded(e));
return true;
} else {
return false;
}
}
// following methods just delegate to backing instance
@Override public E poll() { return delegate.poll(); }
@Override public E peek() { return delegate.peek(); }
@Override public int size() { return delegate.size(); }
@Override public Iterator<E> iterator() { return delegate.iterator(); }
}
因此,此ListenableQueue實(shí)現(xiàn)Queue接口具有Queue考慮支持委托隊(duì)列屬性的所有功能(即容量限制、阻塞行為等),因此可以像任何其他Queue.
使用示例:
// we create new `LinkedList` as a backing queue and decorate it
ListenableQueue<String> q = new ListenableQueue<>(new LinkedList<>());
// register a listener which polls a queue and prints an element
q.registerListener(e -> System.out.println(q.poll()));
// voila!
q.add("record1");
添加回答
舉報(bào)