您的位置:首页 > 其它

设计模式学习笔记--服务定位器模式

2016-12-12 20:12 435 查看

三十二、服务定位器模式

服务定位器模式(Service Locator Pattern),主要用在JDNI中,充分利用缓存来快速定位使用服务service,来提高效率。

实现

创建service接口,以及接口的实现类,也就是具体的service,然后创建服务定位器,和缓存对象类。在创建一个初始化条件类。



Service接口

IService.java


package patterns.service;

/**
* Created by lenovo on 2016/12/12 0012.
* 服务接口
*/
public interface IService {
public String getName();
public void execute();
}


接口实现类

Service1.java


package 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.java


package 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.java


package patterns.intercepting;

/**
* Created by lenovo on 2016/12/12 0012.
* 目标程序类
*/
public class Target {
public void execute(String request){
System.out.println("执行处理请求 "+request);
}
}


缓存类

Cache.java


package 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.java


package 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.java


package 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.java


package 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#服务
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息