Skip to the content.
package com.bookshop.structural.proxy;

import com.bookshop.domain.Book;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

/**
 * The real subject: stands in for the distributor's catalog service, where every
 * lookup is a network round-trip. {@code lookupCount} makes the cost observable.
 */
public class RemoteBookCatalog implements BookCatalog {

    private final Map<String, Book> books = new HashMap<>();
    private int lookupCount;

    public RemoteBookCatalog() {
        add(new Book("978-0201633610", "Design Patterns", "Gamma, Helm, Johnson, Vlissides",
                new BigDecimal("42.00")));
        add(new Book("978-0134685991", "Effective Java", "Joshua Bloch", new BigDecimal("39.99")));
    }

    private void add(Book book) {
        books.put(book.isbn(), book);
    }

    @Override
    public Optional<Book> findByIsbn(String isbn) {
        lookupCount++;
        return Optional.ofNullable(books.get(isbn));
    }

    public int lookupCount() {
        return lookupCount;
    }
}

Raw file