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

我想每当我们在队列中添加元素时,我应该调用一个方法来在队列中添加元素后立即获取。


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

        }

    }

}


烙印99
浏览 115回答 1
1回答

繁星coding

要将监听器添加到队列中,您需要使其“可监听”,最简单的方法是装饰器模式。此模式的目标是在类中添加特性,同时保留其基本功能。在 的情况下Queue,您只需扩展一个AbstractQueue类,覆盖它的offer方法。其他方法只是委托给后备队列,因为它们不需要通知侦听器。public class ListenableQueue<E> extends AbstractQueue<E> {&nbsp; &nbsp; interface Listener<E> {&nbsp; &nbsp; &nbsp; &nbsp; void onElementAdded(E element);&nbsp; &nbsp; }&nbsp; &nbsp; private final Queue<E> delegate;&nbsp; // backing queue&nbsp; &nbsp; private final List<Listener<E>> listeners = new ArrayList<>();&nbsp; &nbsp; public ListenableQueue(Queue<E> delegate) {&nbsp; &nbsp; &nbsp; &nbsp; this.delegate = delegate;&nbsp; &nbsp; }&nbsp; &nbsp; public ListenableQueue<E> registerListener(Listener<E> listener) {&nbsp; &nbsp; &nbsp; &nbsp; listeners.add(listener);&nbsp; &nbsp; &nbsp; &nbsp; return this;&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; public boolean offer(E e) {&nbsp; &nbsp; &nbsp; &nbsp; // here, we put an element in the backing queue,&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; // then notify listeners&nbsp; &nbsp; &nbsp; &nbsp; if (delegate.offer(e)) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; listeners.forEach(listener -> listener.onElementAdded(e));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return true;&nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; // following methods just delegate to backing instance&nbsp; &nbsp; @Override public E poll() { return delegate.poll(); }&nbsp; &nbsp; @Override public E peek() { return delegate.peek(); }&nbsp; &nbsp; @Override public int size() { return delegate.size(); }&nbsp; &nbsp; @Override public Iterator<E> iterator() { return delegate.iterator(); }}因此,此ListenableQueue实现Queue接口具有Queue考虑支持委托队列属性的所有功能(即容量限制、阻塞行为等),因此可以像任何其他Queue.使用示例:// we create new `LinkedList` as a backing queue and decorate itListenableQueue<String> q = new ListenableQueue<>(new LinkedList<>());// register a listener which polls a queue and prints an element&nbsp;q.registerListener(e -> System.out.println(q.poll()));// voila!q.add("record1");
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java