在队列中添加元素时,调用侦听器以通知队列元素是可变的



我希望当我们在队列中添加元素时,我应该调用一个方法,以便在队列中添加元素后立即获取。

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());
        }
    }
}

要将侦听器添加到队列中,您需要使其"可听",最简单的方法是装饰器模式。此模式旨在在类中添加功能,同时保留其基本功能。

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功能,因此可以像任何其他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");