我想在队列中添加元素时,只要在队列中添加元素,就应该调用一种方法来获取。
package com.java.listner;
import java.util.LinkedList;
import java.util.Queue;
public class QueueListner {
public static Queue<String> queue=new LinkedList<String>();
public boolean add(String e) {
itemAvailableInqueue();
return false;
}
public static void main(String[] args) {
queue.add("record1");
System.out.println(queue.poll());
}
public void itemAvailableInqueue() {
int size = queue.size();
for (int i = 1; i < size; i++) {
System.out.println(queue.poll());
}
}
}
答案 0 :(得分:0)
要将侦听器添加到队列中,需要使其“可监听”,最简单的方法是Decorator pattern。这种模式的目标是在类中添加功能,同时保持其基本功能。
对于Queue
,您只需扩展AbstractQueue
类,覆盖其offer
方法。其他方法只是委托给后备队列,因为它们不需要通知侦听器。
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
实现了Queue
接口,因此具有所有Queue
功能,并考虑了后备委托队列的属性(例如,容量约束,阻塞行为等),因此可以像其他任何{ {1}}。
用法示例:
Queue