gpt4 book ai didi

java - 在队列中添加元素时,调用监听器来通知队列元素是可变的

转载 作者:行者123 更新时间:2023-12-02 09:50:42 26 4
gpt4 key购买 nike

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

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

最佳答案

要将监听器添加到队列中,您需要使其“可监听”,最简单的方法是 Decorator pattern 。此模式的目标是在类中添加功能,同时保留其基本功能。

对于Queue,您只需扩展 AbstractQueue类,重写其 offer 方法。其他方法只是委托(delegate)给后备队列,因为它们不需要通知监听器。

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接口(interface),因此考虑到支持委托(delegate)队列的属性(即容量限制、阻塞行为等),具有所有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");

关于java - 在队列中添加元素时,调用监听器来通知队列元素是可变的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56336731/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com