Wzorzec projektowy - wzorzec lokalizatora usługi
Wzorzec projektowy lokalizatora usług jest używany, gdy chcemy zlokalizować różne usługi za pomocą wyszukiwania JNDI. Biorąc pod uwagę wysoki koszt wyszukania JNDI dla usługi, wzorzec Service Locator wykorzystuje technikę buforowania. Po raz pierwszy wymagana jest usługa, Lokalizator usług wyszukuje w JNDI i buforuje obiekt usługi. Dalsze wyszukiwanie lub ta sama usługa za pośrednictwem Service Locator odbywa się w jego pamięci podręcznej, co znacznie poprawia wydajność aplikacji. Poniżej znajdują się elementy tego typu wzorca projektowego.
Service- Rzeczywista usługa, która przetworzy żądanie. Odniesienia do takiej usługi należy szukać na serwerze JNDI.
Context / Initial Context - Kontekst JNDI zawiera odniesienie do usługi używanej w celu wyszukiwania.
Service Locator - Service Locator to pojedynczy punkt kontaktu w celu uzyskania usług przez buforowanie wyszukiwania JNDI.
Cache - Pamięć podręczna do przechowywania referencji usług w celu ich ponownego wykorzystania
Client - Klient to obiekt, który wywołuje usługi za pośrednictwem ServiceLocator.
Realizacja
Zamierzamy stworzyć ServiceLocator , InitialContext , Cache , Service jako różne obiekty reprezentujące nasze encje. Service1 i Service2 reprezentują konkretne usługi.
ServiceLocatorPatternDemo , nasza klasa demonstracyjna, działa tutaj jako klient i użyje ServiceLocator do zademonstrowania wzorca projektowego lokalizatora usług.
Krok 1
Utwórz interfejs usługi.
Service.java
public interface Service {
public String getName();
public void execute();
}
Krok 2
Twórz konkretne usługi.
Service1.java
public class Service1 implements Service {
public void execute(){
System.out.println("Executing Service1");
}
@Override
public String getName() {
return "Service1";
}
}
Service2.java
public class Service2 implements Service {
public void execute(){
System.out.println("Executing Service2");
}
@Override
public String getName() {
return "Service2";
}
}
Krok 3
Utwórz InitialContext do wyszukiwania JNDI
InitialContext.java
public class InitialContext {
public Object lookup(String jndiName){
if(jndiName.equalsIgnoreCase("SERVICE1")){
System.out.println("Looking up and creating a new Service1 object");
return new Service1();
}
else if (jndiName.equalsIgnoreCase("SERVICE2")){
System.out.println("Looking up and creating a new Service2 object");
return new Service2();
}
return null;
}
}
Krok 4
Utwórz pamięć podręczną
Cache.java
import java.util.ArrayList;
import java.util.List;
public class Cache {
private List<Service> services;
public Cache(){
services = new ArrayList<Service>();
}
public Service getService(String serviceName){
for (Service service : services) {
if(service.getName().equalsIgnoreCase(serviceName)){
System.out.println("Returning cached " + serviceName + " object");
return service;
}
}
return null;
}
public void addService(Service newService){
boolean exists = false;
for (Service service : services) {
if(service.getName().equalsIgnoreCase(newService.getName())){
exists = true;
}
}
if(!exists){
services.add(newService);
}
}
}
Krok 5
Utwórz lokalizator usług
ServiceLocator.java
public class ServiceLocator {
private static Cache cache;
static {
cache = new Cache();
}
public static Service getService(String jndiName){
Service service = cache.getService(jndiName);
if(service != null){
return service;
}
InitialContext context = new InitialContext();
Service service1 = (Service)context.lookup(jndiName);
cache.addService(service1);
return service1;
}
}
Krok 6
Użyj ServiceLocator, aby zademonstrować wzorzec projektowy lokalizatora usług.
ServiceLocatorPatternDemo.java
public class ServiceLocatorPatternDemo {
public static void main(String[] args) {
Service service = ServiceLocator.getService("Service1");
service.execute();
service = ServiceLocator.getService("Service2");
service.execute();
service = ServiceLocator.getService("Service1");
service.execute();
service = ServiceLocator.getService("Service2");
service.execute();
}
}
Krok 7
Sprawdź dane wyjściowe.
Looking up and creating a new Service1 object
Executing Service1
Looking up and creating a new Service2 object
Executing Service2
Returning cached Service1 object
Executing Service1
Returning cached Service2 object
Executing Service2