服務(wù)定位器模式(Service Locator Pattern)用在我們想使用 JNDI 查詢定位各種服務(wù)的時候闺鲸。考慮到為某個服務(wù)查找 JNDI 的代價很高悉罕,服務(wù)定位器模式充分利用了緩存技術(shù)。在首次請求某個服務(wù)時壁袄,服務(wù)定位器在 JNDI 中查找服務(wù),并緩存該服務(wù)對象涩僻。當再次請求相同的服務(wù)時栈顷,服務(wù)定位器會在它的緩存中查找,這樣可以在很大程度上提高應(yīng)用程序的性能萄凤。以下是這種設(shè)計模式的實體蛙卤。
服務(wù)(Service)?- 實際處理請求的服務(wù)。對這種服務(wù)的引用可以在 JNDI 服務(wù)器中查找到颤难。
Context / 初始的 Context?- JNDI Context 帶有對要查找的服務(wù)的引用已维。
服務(wù)定位器(Service Locator)?- 服務(wù)定位器是通過 JNDI 查找和緩存服務(wù)來獲取服務(wù)的單點接觸。
緩存(Cache)?- 緩存存儲服務(wù)的引用栅屏,以便復(fù)用它們堂鲜。
客戶端(Client)?- Client 是通過 ServiceLocator 調(diào)用服務(wù)的對象。
實現(xiàn)
我們將創(chuàng)建?ServiceLocator缔莲、InitialContext、Cache痴奏、Service?作為表示實體的各種對象。Service1?和?Service2?表示實體服務(wù)擅憔。
ServiceLocatorPatternDemo檐晕,我們的演示類在這里是作為一個客戶端,將使用?ServiceLocator?來演示服務(wù)定位器設(shè)計模式。
步驟 1
創(chuàng)建服務(wù)接口 Service篡石。
Service.java
public interface Service {
? public String getName();
? public void execute();
}
步驟 2
創(chuàng)建實體服務(wù)笛洛。
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";
? }
}
步驟 3
為 JNDI 查詢創(chuàng)建 InitialContext苛让。
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;? ? ?
? }
}
步驟 4
創(chuàng)建緩存 Cache。
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);
? ? ? }?
?}
}
步驟 5
創(chuàng)建服務(wù)定位器瘦材。
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;
? }
}
步驟 6
使用?ServiceLocator?來演示服務(wù)定位器設(shè)計模式食棕。
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();? ? ?
? }
}
步驟 7
執(zhí)行程序错沽,輸出結(jié)果:
Looking up and creating a new Service1 objectExecuting Service1Looking up and creating a new Service2 objectExecuting Service2Returning cached? Service1 objectExecuting Service1Returning cached? Service2 objectExecuting Service2
本文轉(zhuǎn)載:https://www.runoob.com/design-pattern/design-pattern-intro.html