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ácservice
.Service Locator
– gửi yêu cầu tìm kiếmservice
tới JNDI và ghi đệm cácservice
đã được sử dụng.Cache
– bộ nhớ đệm lưu trữ các tham chiếu tới cácservice
đã được sử dụng.Client
– object gửi yêu cầu tớiService 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