┌─────────────────────────────────────────────┐ │ <<interface>> │ │ ServiceDiscovery │ ← Mediator ├─────────────────────────────────────────────┤ │ + registerClient(Client): void │ │ + registerService(Service): void │ │ + discoverService(Client, String): void │ │ + notifyAvailability(Service, String): void │ └─────────────────────────────────────────────┘ △ │ implements │ ┌─────────────────────────────────────────────┐ │ ServiceDiscoveryMediator │ ← Concrete Mediator ├─────────────────────────────────────────────┤ │ - clients: List<Client> │ │ - services: List<Service> │ │ + registerClient(Client): void │ │ + registerService(Service): void │ │ + discoverService(Client, String): void │ │ + notifyAvailability(Service, String): void │ └─────────────────────────────────────────────┘ ┌───────────────────────────────────────┐ │ <<interface>> │ │ Colleague │ ← Colleague Interface ├───────────────────────────────────────┤ │ + getId(): String │ │ + setMediator(ServiceDiscovery): void │ └───────────────────────────────────────┘ △ │ implements │ ┌──────────────────────────────┬──────────────────────────────────────────┐ │ Client │ Service │ ← Concrete Colleagues ├──────────────────────────────┼──────────────────────────────────────────┤ │ - id: String │ - id: String │ │ - mediator: ServiceDiscovery │ - mediator: ServiceDiscovery │ │ + discoverService(String) │ + notifyAvailability(String) │ │ + receiveServiceInfo() │ + receiveDiscoveryRequest() │ └──────────────────────────────┴──────────────────────────────────────────┘
Mediator Interface
:public interface ServiceDiscovery { void registerClient(final Client client); void registerService(final Service service); void discoverService(final Client client, final String serviceName); void notifyAvailability(final Service service, final String serviceName); }
Concrete Mediator
:public class ServiceDiscoveryMediator implements ServiceDiscovery { private List<Client> clients = new ArrayList<>(); private List<Service> services = new ArrayList<>(); public void registerClient(final Client client) { clients.add(client); System.out.println("ServiceDiscovery: Registered client " + client.getId()); } public void registerService(final Service service) { services.add(service); System.out.println("ServiceDiscovery: Registered service " + service.getId()); } public void discoverService(final Client client, final String serviceName) { System.out.println("ServiceDiscovery: Processing discovery request for " + serviceName); for (Service service : services) { service.receiveDiscoveryRequest(client, serviceName); } } public void notifyAvailability(final Service service, final String serviceName) { System.out.println("ServiceDiscovery: Processing availability notification for " + serviceName); for (Client client : clients) { client.receiveServiceInfo(service, serviceName); } } }
Colleague Interface
:public interface Colleague { String getId(); void setMediator(final ServiceDiscovery mediator); }
Colleague Classes
:public class Client implements Colleague { private final String id; private ServiceDiscovery mediator; public Client(final String id) { this.id = id; } public String getId() { return id; } public void setMediator(final ServiceDiscovery mediator) { this.mediator = mediator; } public void discoverService(final String serviceName) { System.out.println("[Client " + id + "] Discovering service: " + serviceName); mediator.discoverService(this, serviceName); } public void receiveServiceInfo(final Service service, final String serviceName) { System.out.println("[Client " + id + "] Received info: Service '" + service.getId() + "' provides: " + serviceName); } }Service Colleague:
public class Service implements Colleague { private final String id; private ServiceDiscovery mediator; public Service(final String id) { this.id = id; } public String getId() { return id; } public void setMediator(final ServiceDiscovery mediator) { this.mediator = mediator; } public void notifyAvailability(final String serviceName) { System.out.println("[Service " + id + "] Notifying availability of: " + serviceName); mediator.notifyAvailability(this, serviceName); } public void receiveDiscoveryRequest(final Client client, final String serviceName) { System.out.println("[Service " + id + "] Received discovery request from Client '" + client.getId() + "' for: " + serviceName); } }
public class MediatorPatternTest { public static void main(String[] args) { // Create the service discovery mediator ServiceDiscovery serviceDiscovery = new ServiceDiscoveryMediator(); // Create clients and services Client client1 = new Client("client1"); Client client2 = new Client("client2"); Service service1 = new Service("ocr-service"); Service service2 = new Service("tika-service"); // Set mediator for all colleagues client1.setMediator(serviceDiscovery); client2.setMediator(serviceDiscovery); service1.setMediator(serviceDiscovery); service2.setMediator(serviceDiscovery); // Register colleagues with service discovery serviceDiscovery.registerClient(client1); serviceDiscovery.registerClient(client2); serviceDiscovery.registerService(service1); serviceDiscovery.registerService(service2); System.out.println("Service Discovery"); client1.discoverService("ocr-api"); System.out.println("Service Availability Notification"); service1.notifyAvailability("ocr-processing"); } }