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

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

  1. Service Locator Pattern 服务定位

    https://www.geeksforgeeks.org/service-locator-pattern/ Service Locator Pattern Last Updated: 06-03-2 ...

  2. Design Pattern - Service Locator Pattern--转载

    原文地址:http://www.tutorialspoint.com/design_pattern/service_locator_pattern.htm The service locator de ...

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

    本文内容 场景 目标 解决方案 实现细节 思考 相关模式 更多信息 参考资料 Common Service Locator 代码很简单,它一般不会单独使用,而是作为一个单件模式,与像 .net Uni ...

  4. 《Prism 5.0源码走读》Service Locator Pattern

    在Prism Bootstrapper里面取实例的时候使用 ServiceLocator模式,使用的是CommonServiceLocator库 (http://commonservicelocato ...

  5. [Architecture Pattern] Singleton Locator

    [Architecture Pattern] Singleton Locator 目的 组件自己提供Service Locator模式,用来降低组件的耦合度. 情景 在开发系统时,底层的Infrast ...

  6. Service Locator 模式

    什么是Service Locator 模式? 服务定位模式(Service Locator Pattern)是一种软件开发中的设计模式,通过应用强大的抽象层,可对涉及尝试获取一个服务的过程进行封装.该 ...

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

    原文:https://www.dotnettricks.com/learn/dependencyinjection/understanding-inversion-of-control-depende ...

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

    Atitit.如何实现dip, di ,ioc  ,Service Locator的区别于联系 1. Dip原则又来自于松耦合思想方向1 2. 要实现dip原则,有以下俩个模式1 3. Ioc和di的 ...

  9. [Design Pattern] Front Controller Pattern 简单案例

    Front Controller Pattern, 即前端控制器模式,用于集中化用户请求,使得所有请求都经过同一个前端控制器处理,处理内容有身份验证.权限验证.记录和追踪请求等,处理后再交由分发器把请 ...

随机推荐

  1. session绑定javaBean

    1.HttpSessionBindingListener   这个监听器,可以让javaBean对象,感知它被绑定到session中或从session中移除.2.HttpSessionActivati ...

  2. JS可控制的图片自动循环播放查看效果

    JS可控制的图片自动循环播放查看效果 <html> <head> <title>JS可控制的图片自动循环播放查看效果丨芯晴网页特效丨CsrCode.Cn</t ...

  3. python-打印简单公司员工信息表

    python-打印简单公司员工信息表 要求,输入name不为空,输入次数最多3次,3次后跳出程序: 知识点: raw_input str转int whil if elif else continue ...

  4. noip 2012 疫情控制

    /* 考试的时候没想出正解 也没打暴力 时间不够了 随便yy了几种情况按出现的先后顺序处理而没有贪心 的了20分 不粘了 正解是围绕首都的儿子来搞的 显然先二分答案 对于每个限定的最大时间 我们尝试着 ...

  5. wpf的学习日志(二)

    window演示基础(windows presentation Foundation)用于windowsw图形显示系统 InitializeComponent()方法的工作就是system.windo ...

  6. OD: Vulnerabilities Analyze Skills

    第五篇了,漏洞分析案例 漏洞利用的灵活程度让这门技术变得似乎没有什么原则可言,只有实践后总结提高才能挥洒自如. 漏洞分析方法 目标:弄清攻击原理.评估潜在利用方式及风险等级.扎实的漏洞利用技术是进行漏 ...

  7. 关于asp.net程序连接不了ORACLE数据库而PL/SQL可以连接的问题

    今天在发布ASP.NET WEB网站时发现程序连接不了数据 报“ORA-12154: TNS: 无法解析指定的连接标识符”的错误,但PL/SQL连接又没有问题.真莫名其秒.在百度找了好多相关的问题.都 ...

  8. jquery ajax(5)form表单序列化

    form表单序列化<script type="text/javascript"> $(function(){ $("#send").click(fu ...

  9. cypress的EZ-USB对于USB的介绍

    Host is MasterThis is a fundamental USB concept. There is exactly onemaster in a USB system: the hos ...

  10. Solr In Action 笔记(2) 之 评分机制(相似性计算)

    Solr In Action 笔记(2) 之评分机制(相似性计算) 1 简述 我们对搜索引擎进行查询时候,很少会有人进行翻页操作.这就要求我们对索引的内容提取具有高度的匹配性,这就搜索引擎文档的相似性 ...