[Design Pattern] Service Locator Pattern 简单案例

Service Locator Pattern,即服务定位模式,用于定位不同的服务。考虑到 InitialContext::lookup 的成本比较高,提供了 Cache 类缓存以定位到的服务。

代码实现

Service 接口

public interface Service {

    public String getName();

    public void execute();
}

Service1, Service2 实现 Service 接口,提供具体服务

public class Service1 implements Service {

    private String name = "service1";

    @Override
    public String getName() {
        return name;
    }

    @Override
    public void execute() {
        System.out.println(name + "executing");
    }
}
public class Service2 implements Service {

    private String name = "service2";

    @Override
    public String getName() {
        return name;
    }

    @Override
    public void execute() {
        System.out.println(name + " executing");
    }
}

InitialContext 用于查找并初始化服务

public class InitialContext {

    public static Service lookup(String jndiName){

        System.out.println(" initializing " + jndiName);

        if (jndiName.equals("service1")){
            return new Service1();
        }
        else if(jndiName.equals("service2")){
            return new Service2();
        }
        else{
            System.out.println("cannot find " + jndiName);
        }

        return null;
    }
}

ServiceLocator 是在 InitialConext 之前的一个层,把已找到的服务缓存起来,避免重复创建服务。

public class ServiceLocator {

    private static Cache cache = new Cache();

    public static Service getService(String serviceName){
        Service service = cache.getService(serviceName);

        if (service == null){
            service = InitialContext.lookup(serviceName);
            cache.addService(service);
        }
        return service;
    }
}

演示服务定位模式。

public class ServiceLocatorPatternDemo {

    public static void main() {
        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();
    }
}

注:

为了简化模式关系演示,本案例没有处理找不到服务的情况,可以在 InitialContext::lookup 和 ServiceLocator::getService 方法声明爆出异常,交由客户端代码处理服务无法找到的情况。

参考资料

Design Pattern - Service Locator Pattern, TutorialsPoint

时间: 2024-10-13 16:01:28

[Design Pattern] Service Locator Pattern 简单案例的相关文章

Design Pattern - Service Locator Pattern--转载

原文地址:http://www.tutorialspoint.com/design_pattern/service_locator_pattern.htm The service locator design pattern is used when we want to locate various services using JNDI lookup. Considering high cost of looking up JNDI for a service, Service Locato

.NET 服务器定位模式(Service Locator Pattern)

本文内容 场景 目标 解决方案 实现细节 思考 相关模式 更多信息 参考资料 下载 Demo 场景 你有一个类,该类依赖几个服务 Service(事实上,这些服务可以看做是另几个类),这些服务是在编译阶段指定具体类型的.在接下来的例子中,ClassA 在编译阶段依赖 ServiceA 和ServiceB.下图说明这个问题. 这种情况有如下缺点: 若替换或更新依赖的服务(或类),显然,必须修改源代码,并且重新编译解决方案: 这些依赖的具体实现(依赖的服务的具体实现)必须在编译时可用:The con

[Architecture Pattern] Singleton Locator

[Architecture Pattern] Singleton Locator 目的 组件自己提供Service Locator模式,用来降低组件的耦合度. 情景 在开发系统时,底层的Infrastructure Context.或是核心的Domain Context这些共享对象生成之后,会在系统的许多地方被使用.为了减少共享对象初始生成.参考传递所造成的困扰,可以在系统内套用Service Locator模式,提供统一的静态参考点来生成.存取这些共享对象. Service Locator参考

Service Locator 模式

什么是Service Locator 模式? 服务定位模式(Service Locator Pattern)是一种软件开发中的设计模式,通过应用强大的抽象层,可对涉及尝试获取一个服务的过程进行封装.该模式使用一个称为"Service Locator"的中心注册表来处理请求并返回处理特定任务所需的必要信息. 场景描述 某类ClassA依赖于服务ServiceA和服务ServiceB,服务的具体类型需在编译时指定. 这种条件下有以下缺点: 尝试替换或更新依赖项,必须更改类的源代码并且重新编

【转】Understanding Inversion of Control, Dependency Injection and Service Locator Print

原文:https://www.dotnettricks.com/learn/dependencyinjection/understanding-inversion-of-control-dependency-injection-and-service-locator ----------------------------------------------------------------------------------------- Understanding Inversion of

Atitit。如何实现dip, di ,ioc ,Service Locator的区别于联系

Atitit.如何实现dip, di ,ioc  ,Service Locator的区别于联系 1. Dip原则又来自于松耦合思想方向1 2. 要实现dip原则,有以下俩个模式1 3. Ioc和di的区别1 4. Service Locator模式1 5.  Service Locator vs. Dependency Injection2 6. 参考2 1. Dip原则又来自于松耦合思想方向 松耦合系统的好处有两点:一点是它适应变化的灵活性:另一点是当某个服务的内部结构和实现逐渐发生改变时,不

[Design Pattern] Mediator Pattern 简单案例

Meditor Pattern,即调解模式,用一个调解类类处理所有的沟通事件,使得降低多对象之间的沟通难度,属于行为类的设计模式.为了方便理解记忆,我也称其为,沟通模式. 下面是一个调解模式的简单案例. ChatRoom 提供公用发送短信的方法.User 全部通过 ChatRoom 类发送信息进行沟通.MediatorPatternDemo 演示调解模式. 代码实现 ChatRoom 提供发送信息的方法 public class ChatRoom { public static void sho

[Design Pattern] Iterator Pattern 简单案例

Iterator Pattern,即迭代时模式,按照顺序依次遍历集合内的每一个元素,而不用了解集合的底层实现,属于行为类的设计模式.为了方便理解记忆,我也会称其为遍历模式. 下面是一个迭代器模式的简单案例. Iterator 定义了迭代接口, 仅 hasNext 和 next 两个方法.Container 定义了集合的接口,必须包含一个返回迭代器类 Iterator 的方法.NameRepository 是容器的具体类,实现 Container 接口,并拥有一个内部类 NameIterator

[Design Pattern] Observer Pattern 简单案例

Observer Pattern,即观察者模式,当存在一对多关系,例如一个对象一有变动,就要自动通知被依赖的全部对象得场景,属于行为类的设计模式. 下面是一个观察者模式的简单案例. Observer 定义观察者的接口,定义需要观察的对象,已经被通知的接口.BinaryObserver, OctalObserver, HexaObserver 各自实现了 Observer 接口. Subject 是被观察的对象,记录了观察该对象的观察者列表,自身有变动,即可通知观察者列表中的各个观察者. 代码实现