Mẫu thiết kế - Mẫu định vị dịch vụ

Mẫu thiết kế bộ định vị dịch vụ được sử dụng khi chúng ta muốn định vị các dịch vụ khác nhau bằng cách sử dụng tra cứu JNDI. Xem xét chi phí tra cứu JNDI cho một dịch vụ cao, mẫu Service Locator sử dụng kỹ thuật bộ nhớ đệm. Lần đầu tiên một dịch vụ được yêu cầu, Service Locator sẽ tìm kiếm trong JNDI và lưu vào bộ nhớ cache đối tượng dịch vụ. Việc tra cứu thêm hoặc cùng một dịch vụ thông qua Service Locator được thực hiện trong bộ nhớ cache của nó, giúp cải thiện hiệu suất của ứng dụng ở mức độ lớn. Sau đây là các thực thể của kiểu thiết kế này.

  • Service- Dịch vụ thực tế sẽ xử lý yêu cầu. Tham chiếu của dịch vụ như vậy sẽ được xem xét trong máy chủ JNDI.

  • Context / Initial Context - JNDI Context mang tham chiếu đến dịch vụ được sử dụng cho mục đích tra cứu.

  • Service Locator - Service Locator là một điểm liên hệ duy nhất để nhận các dịch vụ bằng cách tra cứu JNDI vào bộ nhớ đệm các dịch vụ.

  • Cache - Bộ nhớ đệm để lưu trữ các tham chiếu của các dịch vụ để sử dụng lại chúng

  • Client - Máy khách là đối tượng gọi ra các dịch vụ thông qua ServiceLocator.

Thực hiện

Chúng ta sẽ tạo ServiceLocator , InitialContext , Cache , Service như các đối tượng khác nhau đại diện cho các thực thể của chúng ta. Service1Service2 đại diện cho các dịch vụ cụ thể.

ServiceLocatorPatternDemo , lớp demo của chúng tôi, đang hoạt động như một ứng dụng khách ở đây và sẽ sử dụng ServiceLocator để chứng minh Mẫu thiết kế Service Locator.

Bước 1

Tạo giao diện Dịch vụ.

Service.java

public interface Service {
   public String getName();
   public void execute();
}

Bước 2

Tạo ra các dịch vụ cụ thể.

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";
   }
}

Bước 3

Tạo InitialContext để tra cứu 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;		
   }
}

Bước 4

Tạo bộ nhớ đệm

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);
      }
   }
}

Bước 5

Tạo bộ định vị dịch vụ

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;
   }
}

Bước 6

Sử dụng ServiceLocator để chứng minh Mẫu thiết kế Service Locator.

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();		
   }
}

Bước 7

Xác minh kết quả đầu ra.

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