一、概念
什么是服务提供者框架?
多个服务提供者实现一个服务,系统为服务提供者的客户端提供多个实现,并把他们从多个实现中解耦出来(来自百科)。是不是很晦涩呀,其实简单说来就是:提供者为框架的用户提供了多个API实现,框架必须提供一种机制来注册这些实现以便用户能够使用它们;框架的客户直接使用API,无需关心自己到底在使用哪个实现。
二、实现原理
一般有三个组件组成:
1、服务接口(Service Interface),由服务提供者实现。
2、提供者注册API(Provider Registration API),这是系统用来注册实现,让客户端访问他们的。
3、服务访问API(Service Access API),是客户端用来获取服务的实例的。
4、(可选) 服务提供者接口(Service Provider Interface),这些服务提供者负责创建其服务实现的实例。如果没有Service Provider Interface,可以通过类名进行注册,并通过反射进行实例化。
下面用UML中的类图表示其中的关系:(对图我就不做说明了,可以对照下面的代码看)
三、案例
例如JDBC(Java数据库连接,Java Database Connectivity)API。
四、自己写的Demo
1、服务接口(Service Interface)
服务者接口
package com.lzw.service; /** * 服务者接口 */ public interface IService { /** * 实现方法doService4Test1() */ public void doService4Test1(); /** * 实现方法doService4Test2() */ public void doService4Test2(); }
服务者实现类
package com.lzw.service.impl; import com.lzw.service.IService; /** * 服务者接口实现类 */ public class ServiceImpl implements IService { /** * 实现方法doService4Test1() */ public void doService4Test1() { System.out.println("do service for test1 ..."); } /** * 实现方法doService4Test2() */ public void doService4Test2() { System.out.println("do service for test2 ..."); } }
2、提供者注册API(Provider Registration API)
提供者接口
package com.lzw.provider; import com.lzw.service.IService; /** * * 提供者接口 * */ public interface IProvider { /** * * 關聯IService,用來獲取服務者接口(一般用來實現面向接口的編程) */ public IService getService(); }
提供者实现类
package com.lzw.provider.impl; import com.lzw.manager.ServiceManager; import com.lzw.provider.IProvider; import com.lzw.service.IService; import com.lzw.service.impl.ServiceImpl; /** * * 提供者接口的实现类 * */ public class ProviderImpl implements IProvider { /** * 实现静态的注册 */ private static final String DEFAULT_PROVIDER = "test"; static { ServiceManager.registerProvider(DEFAULT_PROVIDER, new ProviderImpl()); } /** * * 關聯IService,用來獲取服務者接口(一般用來實現面向接口的編程) */ public IService getService() { return new ServiceImpl(); } }
3、服务访问API(Service Access API)
服务访问管理类
package com.lzw.manager; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import com.lzw.provider.IProvider; import com.lzw.service.IService; public class ServiceManager { /** * 私有无参数构造器 */ private ServiceManager() { } /** * */ private static final Map<String, IProvider> providers = new ConcurrentHashMap<String, IProvider>(); public static void registerProvider(String name, IProvider p) { providers.put(name, p); } /** * * 关联IService,通过提供者来获取服务者接口 * * */ public static IService getService(String name) { IProvider p = providers.get(name); if (p == null) { throw new IllegalArgumentException( "No provider registered with name:" + name); } return p.getService(); } }
4、客户端测试类
package com.lzw; import com.lzw.manager.ServiceManager; import com.lzw.service.IService; /** * * 客户端测试类 * */ public class Client { /** * @param args * @throws ClassNotFoundException */ public static void main(String[] args) throws ClassNotFoundException { Class.forName("com.lzw.provider.impl.ProviderImpl"); IService service = ServiceManager.getService("test"); service.doService4Test1(); service.doService4Test2(); } }
一大早起来到现在总算把这个笔记写完了,Congratulation!
相关推荐
《Effective Java》第三版中文版目录 第一章 介绍 1 第二章 创建和销毁对象 4 1 考虑用静态工厂方法替换构造器 4 2 当遇到多个构造器参
effective-java.pdf
Effective Java读书笔记.pdf
Effective java 3 学习记录
effective java 读书笔记,第二版自己摘要并翻译,以备速查。
Effective Java读书笔记,记载了大部分我觉的有用的东西,前半部分有代码说明,但后半部分的代码,太过琐碎,就没有整理
【Effective Java】阅读笔记markdown 文件
effective-java 配套代码
《Effective Java》读书分享.pptx
15. 使类和成员的可访问性最小化 16. 在公有类中使用访问方法而非公有域 17.使可变性最小化:不可变类
无论你是否是Java开发人员,本书都将为你开发高效的企业系统提供诸多帮助。“通过这本书,TedNeward将帮助你实现从一个优秀的Java企业应用开发者向一个伟大的开发者的飞跃!” ——John Croupi, Sun著名工程师,...
Effective Java Effective Java Effective Java
Effective Enterprise Java
effectiveJava的笔记
我尽我最大的可能为大家提供了一个最佳实践 —— 《effective java》 第三版。我希望第三版继续满足需求,同时继承前两版的精神。 Small is beautiful, but simple ain’t easy 。 蓝领不是贬低的意思,主要是 ...
java四大名著之一:Effective.Enterprise.Java.中文版 高清pdf 下载
分享effectiveenterprisejava中文版
effective java,英文第三版,内容不错,有需要可以下载