33-Java服务定位器模式 (Service Locator Pattern)

news/2024/11/7 23:35:35/

Java服务定位器模式

    • 实现
    • 范例

  • 服务定位器模式(Service Locator Pattern)用于想使用 JNDI 查询定位各种服务的时候
  • 考虑到为某个服务查找 JNDI 的代价很高,服务定位器模式充分利用了缓存技术
  • 在首次请求某个服务时,服务定位器在 JNDI 中查找服务,并缓存该服务对象
  • 当再次请求相同的服务时,服务定位器会在它的缓存中查找,这样可以在很大程度上提高应用程序的性能
  • 以下是这种设计模式的实体:
    • 服务(Service) - 实际处理请求的服务。对这种服务的引用可以在 JNDI 服务器中查找到
    • Context / 初始的 Context - JNDI Context 带有对要查找的服务的引用
    • 服务定位器(Service Locator) - 服务定位器是通过 JNDI 查找和缓存服务来获取服务的单点接触
    • 缓存(Cache) - 缓存存储服务的引用,以便复用它们
    • 客户端(Client) - Client 是通过 ServiceLocator 调用服务的对象

实现

在这里插入图片描述

  • 创建 ServiceLocator 、 InitialContext 、 Cache 、 Service 作为表示实体的各种对象
  • Service1 和 Service2 表示实体服务
  • ServiceLocatorPatternDemo ,我们的演示类在这里是作为一个客户端,将使用 ServiceLocator 来演示服务定位器设计模式

范例

1. 创建服务接口 Service

Service.java

package com.demo.gof;
public interface Service{public String getName();public void execute();
}

2. 创建实体服务

Service1.java

package com.demo.gof;
public class Service1 implements Service {public void execute(){System.out.println("Executing Service1");}@Overridepublic String getName() {return "Service1";}
}

Service2.java

package com.demo.gof;
public class Service2 implements Service {public void execute(){System.out.println("Executing Service2");}@Overridepublic String getName() {return "Service2";}
}

3. 为 JNDI 查询创建 InitialContext

InitialContext.java

package com.demo.gof;
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 Service2 object");return new Service2();}return null;      }
}

4. 创建缓存 Cache

Cache.java

package com.demo.gof;
import java.util.ArrayList;
import java.util.List;public class Cache {private List<Service> services;public Cache(){services = new ArrayList<Service>();}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);}}
}

5. 创建服务定位器 ServiceLocator

ServiceLocator.java

package com.demo.gof;
public class ServiceLocator {private static Cache cache;static {cache = new Cache();      }public static Service getService(String jndiName){Service service = cache.getService(jndiName);if(service != null){return service;}InitialContext context = new InitialContext();Service service1 = (Service)context.lookup(jndiName);cache.addService(service1);return service1;}
}

6. 使用 ServiceLocator 来演示服务定位器设计模式

ServiceLocatorPatternDemo.java

package com.demo.gof;
public class ServiceLocatorPatternDemo{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();        }
}编译运行以上 Java 范例,输出结果如下```java
$ javac -d . src/main/com.demo/gof/ServiceLocatorPatternDemo.java
$ java  com.demo.gof.ServiceLocatorPatternDemo
Looking up and creating a new Service1 object
Executing Service1
Looking up and creating a new Service2 object
Executing Service2
Returning cached  Service1 object
Executing Service1
Returning cached  Service2 object
Executing Service2

http://www.ppmy.cn/news/1394686.html

相关文章

Day28:学习SpringCloud

学习计划&#xff1a;完成尚硅谷的尚上优选项目 学习进度&#xff1a;完成尚上优选项目的前置知识点&#xff1a;SpringCloud 知识点&#xff1a; 多级缓存 1. 什么是多级缓存 2. JVM进程缓存 a. 导入案例 b. 初识Caffeine c. 实现JVM进程缓存 3. Lua语法入门 a. 初识…

arm作业3

key_inc.c #include"key_inc.h"void key1_it_config(){//使能GPIOF外设时钟RCC->MP_AHB4ENSETR | (0x1<<5);//将PF9设置为输入模式GPIOF->MODER & (~(0x3<<18));//设置由PF9管脚产生EXTI9事件EXTI->EXTICR3 & (~(0XFF<<8));EXTI-…

政安晨:【深度学习实践】【使用 TensorFlow 和 Keras 为结构化数据构建和训练神经网络】(五)—— Dropout和批归一化

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras实战演绎 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; Dropout和批归一化是深度学习领域中常用的正则化技术…

python绘图matplotlib——使用记录1

本博文来自于网络收集&#xff0c;如有侵权请联系删除 使用matplotlib绘图 1 常用函数汇总1.1 plot1.2 legend1.3 scatter1.4 xlim1.5 xlabel1.6 grid1.7 axhline1.7 axvspan1.8 annotate1.9 text1.10 title 2 常见图形绘制2.1 bar——柱状图2.2 barh——条形图2.3 hist——直…

Uibot6.0 (RPA财务机器人师资培训第2天 )采购付款——网银付款机器人案例实战

训练网站&#xff1a;泓江科技 (lessonplan.cn)https://laiye.lessonplan.cn/list/ec0f5080-e1de-11ee-a1d8-3f479df4d981https://laiye.lessonplan.cn/list/ec0f5080-e1de-11ee-a1d8-3f479df4d981(本博客中会有部分课程ppt截屏,如有侵权请及请及时与小北我取得联系~&#xff0…

贪心算法的魅力与应用

在算法的世界里&#xff0c;贪心算法&#xff08;Greedy Algorithm&#xff09;以其简洁而高效的策略吸引着我们的目光。本文将深入探讨贪心算法的原理、特点以及它在实际问题中的广泛应用。 一、什么是贪心算法&#xff1f; 贪心算法是一种在每一步选择中都采取当前看起来最优…

最大公因数和最小公倍数

题目&#xff1a;P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 代码&#xff1a; #include<bits/stdc.h> #define int long long using namespace std; int x,y,ans,flag; int gcd(int x,int y){return y0?x:gc…

企业计算机服务器中了locked勒索病毒怎么处理?Locked勒索病毒解密流程

在网络技术不断发展应用过程中&#xff0c;越来越多的企业利用网络开展各项工作业务&#xff0c;网络为企业的生产运营提供了极大便利&#xff0c;但网络威胁手段也在不断增加&#xff0c;为企业的数据安全带来严重威胁。近日&#xff0c;新一波的网络勒索病毒比较猖獗&#xf…