服务定位器模式

基本介绍

1.考虑到为某个服务查找 JNDI 的代价很高,服务定位器模式充分利用了缓存技术,在首次请求某个服务时,服务定位器在 JNDI 中查找服务,并缓存该服务对象,当再次请求相同的服务时,服务定位器会在它的缓存中查找,这样可以在很大程度上提高应用程序的性能

2.角色

(1)Service:实际处理请求的服务,对这种服务的引用可以在 JNDI 服务器中查找到

(2)Context / 初始的 Context:JNDI Context 带有对要查找的服务的引用

(3)Service Locator:服务定位器,组合 Cache,通过 JNDI 查找和缓存服务来获取服务的单点接触

(4)Cache:缓存,存储服务的引用,以便复用它们

(5)Client:客户端,通过 Service Locator 调用服务的对象

 

代码示例

import java.util.ArrayList;
import java.util.List;

public class Client {//客户端

    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();
    }
}

class ServiceLocator {//服务定位器
    private static Cache cache = new Cache();

    public static Service getService(String serviceName) {//查找服务
        //先从Cache中查找
        Service service = cache.getService(serviceName);
        if (service != null) {
            return service;
        }
        //Cache中没有存储该服务,则创建该服务并存储
        InitialContext context = new InitialContext();
        service = (Service) context.lookup(serviceName);
        cache.addService(service);
        return service;
    }
}

class Cache {//缓存
    private List<Service> services = new ArrayList<>();

    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);
        }
    }
}

class InitialContext {//环境角色

    public Object lookup(String serviceName) {
        if (serviceName.equalsIgnoreCase("SERVICE1")) {
            System.out.println("Looking up and creating a new Service1 object");
            return new Service1();
        } else if (serviceName.equalsIgnoreCase("SERVICE2")) {
            System.out.println("Looking up and creating a new Service2 object");
            return new Service2();
        }
        return null;
    }
}

interface Service {//服务接口

    public String getName();

    public void execute();
}

class Service1 implements Service {//具体服务

    public void execute() {
        System.out.println("Executing Service1");
    }

    @Override
    public String getName() {
        return "Service1";
    }
}

class Service2 implements Service {//具体服务

    public void execute() {
        System.out.println("Executing Service2");
    }

    @Override
    public String getName() {
        return "Service2";
    }
}

 

posted @   半条咸鱼  阅读(52)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示