import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.concurrent.TimeUnit;

// The main method must be in a class named "Main".
class Main {
    public static void main(String[] args) {
        DatabaseService proxyDatabaseService = new ProxyDatabaseService();

        System.out.println("First Execution:");
        System.out.println(proxyDatabaseService.query("SELECT * FROM users"));
        
        System.out.println("\nSecond Execution:");
        System.out.println(proxyDatabaseService.query("SELECT * FROM users"));
    }
}


// Subject Interface
interface DatabaseService {
    String query(String sql);
}

// Real Subject
class RealDatabaseService implements DatabaseService {
    @Override
    public String query(String sql) {
        System.out.println("Querying database...");

        // Simulate database query delay
        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException ie) {
            Thread.currentThread().interrupt();
        }

        return "Result of query: " + sql;
    }
}

// Proxy Handler
class ProxyDatabaseService implements DatabaseService {
    private final RealDatabaseService realService;
    private final Map<String, String> cache;

    public ProxyDatabaseService() {
        this.realService = new RealDatabaseService();
        this.cache = new HashMap<>();
    }

    @Override
    public String query(String sql) {
        // Check cache
        if (cache.containsKey(sql)) {
            System.out.println("Returning result from cache");
            return cache.get(sql);
        }

        String result = realService.query(sql);
        cache.put(sql, result);
        return result;
    }
}

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: