Как сделать цепочку фильтров локальной? - PullRequest
0 голосов
/ 18 января 2020

Я пытаюсь реализовать цепочку фильтров, которая буквально одинакова для каждого входящего сообщения. Есть ли идея, как этот код можно улучшить, чтобы избежать создания FilterChain объекта для каждого сообщения. Делает ли цепочка фильтров как ThreadLocal (и затем просит каждый поток возвращать ее копию) что-то мне в этой ситуации?

// a common interface for all filters that might be added to a filter chain
public interface Filter {
    void doFilter(Message message, FilterChain chain);
}
// a filter chain implementation
class FilterChain {
    private final Iterator<Filter> filtersIterator;

    FilterChain(List<Filter> filters) {
        filtersIterator = filters.iterator();
    }

    void doFilter(Message message) {
        if (filtersIterator.hasNext())
            filtersIterator.next().doFilter(message, this);
    }
}
// an abstract bot class
public abstract class AbstractBot {
    private final Executor executor = Executors.newFixedThreadPool(4);
    private final List<Filter> filters = addFilters();

    // handles message objects
    protected abstract void process(Message message);

    // an overridable hook for subclasses to add their own list of filters
    protected List<Filter> addFilters() {
        return new ArrayList<>();
    }

    public void start() {
        // just before we start, add the last-in-chain filter implemented by lambda,
        // whose only purpose is to hand over a message object to the process-method
        filters.add((message, chain) -> process(message));

        while (true) {
            // make long-polling requests to the server for incoming messages
            List<Message> messages = requestMessages();
            for (Message message : messages) {
                executor.execute(() -> {
                    FilterChain chain = new FilterChain(filters);
                    chain.doFilter(message);
                });
            }
        }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...