三十二、服务定位器模式
服务定位器模式(Service Locator Pattern),主要用在JDNI中,充分利用缓存来快速定位使用服务service,来提高效率。
实现
创建service接口,以及接口的实现类,也就是具体的service,然后创建服务定位器,和缓存对象类。在创建一个初始化条件类。
Service接口
IService.javapackage patterns.service; /** * Created by lenovo on 2016/12/12 0012. * 服务接口 */ public interface IService { public String getName(); public void execute(); }接口实现类
Service1.javapackage patterns.service; /** * Created by lenovo on 2016/12/12 0012. * Service 接口实现类 */ public class Service1 implements IService { @Override public String getName() { return "Service1"; } @Override public void execute() { System.out.println("执行服务,1#服务"); } }Service2.javapackage patterns.service; /** * Created by lenovo on 2016/12/12 0012. * Service 接口实现类 */ public class Service2 implements IService { @Override public String getName() { return "Service2"; } @Override public void execute() { System.out.println("执行服务,2#服务"); } }目标程序类
Target.javapackage patterns.intercepting; /** * Created by lenovo on 2016/12/12 0012. * 目标程序类 */ public class Target { public void execute(String request){ System.out.println("执行处理请求 "+request); } }缓存类
Cache.javapackage patterns.service; import java.util.ArrayList; import java.util.List; /** * Created by lenovo on 2016/12/12 0012. * 缓存类 */ public class Cache { private List<IService> services; public Cache() { services = new ArrayList<>(); } public List<IService> getServices() { return services; } public void addServices(IService service) { boolean exists = false; for (IService s : services) { if (s.getName().equalsIgnoreCase(service.getName())) { exists = true; } } if (!exists) { services.add(service); } } public IService getService(String serviceName) { for (IService s : services) { if (s.getName().equalsIgnoreCase(serviceName)) { return s; } } return null; } }初始化类
InitialContext.javapackage patterns.service; /** * Created by lenovo on 2016/12/12 0012. * 针对JNDI而创建的初始化类 */ 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 Service1 object"); return new Service2(); } return null; } }定位器端
ServiceLocator.javapackage patterns.service; /** * Created by lenovo on 2016/12/12 0012. * 服务定位器 */ public class ServiceLocator { private static Cache cache; static { cache = new Cache(); } public static IService getService(String jndiName) { IService service = cache.getService(jndiName); if (service != null) { return service; } InitialContext context = new InitialContext(); IService service1 = (IService) context.lookup(jndiName); cache.addServices(service1); return service1; } }演示
InterceptingFilterPatternDemo.javapackage patterns.service; /** * Created by lenovo on 2016/12/12 0012. * 演示 */ public class ServiceLocatorPatternDemo { public static void main(String[] args){ //service都是新建 IService service = ServiceLocator.getService("service1"); service.execute(); service = ServiceLocator.getService("service2"); service.execute(); //service开始使用缓存 service = ServiceLocator.getService("service1"); service.execute(); service = ServiceLocator.getService("service2"); service.execute(); } }
输出
Looking up and creating a new Service1 object 执行服务,1#服务 Looking up and creating a new Service1 object 执行服务,2#服务 执行服务,1#服务 执行服务,2#服务
本文介绍了服务定位器模式,一种用于提高服务查找效率的设计模式。通过缓存已创建的服务实例来减少重复创建的成本,适用于JDNI环境。文章通过具体代码示例展示了模式的实现过程。
1202

被折叠的 条评论
为什么被折叠?



