При добавлении элемента в очередь вызов слушателя для уведомления элемента очереди является переменной - PullRequest
0 голосов
/ 28 мая 2019

Я хочу, чтобы, когда бы мы ни добавляли элемент в очередь, я должен вызывать метод для извлечения, как только элемент будет добавлен в очередь.

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

1 Ответ

0 голосов
/ 28 мая 2019

Чтобы добавить слушателя в очередь, вам нужно сделать его «слушаемым», самый простой способ сделать это - Шаблон декоратора .Этот шаблон нацелен на добавление объектов в класс при сохранении его базовой функциональности.

В случае 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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...