[Design Patterns] Service Locator

Service Locator được sử dụng khi chúng ta muốn định vị các object xử lý yêu cầu service khác nhau bằng việc sử dụng trình tìm kiếm JNDI. Hãy lấy ví dụ về một tác vụ tìm kiếm JNDI cho một service tiêu tốn nhiều tài nguyên xử lý của hệ thống và cả thời

Service Locator được sử dụng khi chúng ta muốn định vị các object xử lý yêu cầu service khác nhau bằng việc sử dụng trình tìm kiếm JNDI. Hãy lấy ví dụ về một tác vụ tìm kiếm JNDI cho một service tiêu tốn nhiều tài nguyên xử lý của hệ thống và cả thời gian thực hiện, Service Locator xuất hiện ở đây và tận dụng kĩ thuật ghi nhớ đệm caching để giúp chúng ta hoàn thành công việc. Lần đầu tiên khi 1 service được yêu cầu, Service Locator sẽ tìm kiếm trong JNDI và ghi đệm object được tìm thấy và sử dụng. Những lần yêu cầu sau tới service này được thực hiện qua cache của Service Locator giúp cải thiện hiệu năng xử lý của hệ thống. Sau đây là các thành phần có mặt trong pattern:

  • Service – interface chung cho các class tạo object xử lý yêu cầu.
  • Context – JNDI tập trung tất cả tham chiếu tới các service.
  • Service Locator – gửi yêu cầu tìm kiếm service tới JNDI và ghi đệm các service đã được sử dụng.
  • Cache – bộ nhớ đệm lưu trữ các tham chiếu tới các service đã được sử dụng.
  • Client – object gửi yêu cầu tới Service Locator.

Áp dụng triển khai

Chúng ta sẽ tạo ra interface Service và các class triển khai, sau đó là các class Context, Cache, ServiceLocator. Code client gửi yêu cầu sẽ được viết mô phỏng tại main của PatternDemo.

Bước 1

Tạo interface Service và các class triển khai.

servicelocator/Service.java

packageservicelocator;publicinterfaceService{StringgetName();voidprocess();}

Các class triển khai Service.

servicelocator/OneService.java

packageservicelocator;classOneServiceimplementsService{@OverridepublicStringgetName(){return"One Service";}@Overridepublicvoidprocess(){System.out.println("Processing One Service...");}}// class

servicelocator/AnotherService.java

packageservicelocator;classAnotherServiceimplementsService{@OverridepublicStringgetName(){return"Another Service";}@Overridepublicvoidprocess(){System.out.println("Processing Another Service...");}}// class

Bước 2

Tạo Context để tìm kiếm JDNI.

servicelocator/Context.java

packageservicelocator;classContext{publicServicelookup(String jndiName){if("one service".equalsIgnoreCase(jndiName))returnnewOneService();if("another service".equalsIgnoreCase(jndiName))returnnewAnotherService();elsereturnnull;}}

Bước 3

Tạo Cache ghi đệm các service.

servicelocator/Cache.java

packageservicelocator;importjava.util.ArrayList;importjava.util.List;classCache{privateList<Service> serviceList =newArrayList<Service>();publicServicegetService(String jndiName){List<Service> matched = serviceList
         .stream().filter((service)-> service.getName().equalsIgnoreCase(jndiName)).toList();if(matched.isEmpty())returnnull;elsereturn serviceList.get(0);}publicvoidaddService(Service jndi){if(getService(jndi.getName())!=null){/* do nothing */}else
         serviceList.add(jndi);}}// class

Bước 4

Tạo ServiceLocator.

servicelocator/ServiceLocator.java

packageservicelocator;publicclassServiceLocator{privatestaticCache cache =newCache();publicstaticServicegetService(String jndiName){Service service = cache.getService(jndiName);if(service !=null)returnlog(service);elsereturnrequestService(jndiName);}privatestaticServicerequestService(String jndiName){Context context =newContext();Service service = context.lookup(jndiName);
      cache.addService(service);return service;}privatestaticServicelog(Service service){System.out.println("Found cached service: "+ service.getName());return service;}}

Bước 5

Viết code main để thử hoạt động của pattern.

PatternDemo.java

importservicelocator.Service;importservicelocator.ServiceLocator;publicclassPatternDemo{publicstaticvoidmain(String[] args){Service service;/* Request new services */System.out.println("===============");
      service =ServiceLocator.getService("one service");
      service.process();
      service =ServiceLocator.getService("another service");
      service.process();/* Request cached services */System.out.println("===============");
      service =ServiceLocator.getService("one service");
      service.process();
      service =ServiceLocator.getService("another service");
      service.process();}}

Bước 6

Kiểm chứng lại kết quả được in ra ở console.

console

===============ProcessingOneService...ProcessingAnotherService...===============Found cached service:OneServiceProcessingOneService...Found cached service:OneServiceProcessingOneService...

Nguồn: viblo.asia

Bài viết liên quan

WebP là gì? Hướng dẫn cách để chuyển hình ảnh jpg, png qua webp

WebP là gì? WebP là một định dạng ảnh hiện đại, được phát triển bởi Google

Điểm khác biệt giữa IPv4 và IPv6 là gì?

IPv4 và IPv6 là hai phiên bản của hệ thống địa chỉ Giao thức Internet (IP). IP l

Check nameservers của tên miền xem website trỏ đúng chưa

Tìm hiểu cách check nameservers của tên miền để xác định tên miền đó đang dùn

Mình đang dùng Google Domains để check tên miền hàng ngày

Từ khi thông báo dịch vụ Google Domains bỏ mác Beta, mình mới để ý và bắt đầ