一、概念
什么是服务提供者框架?
多个服务提供者实现一个服务,系统为服务提供者的客户端提供多个实现,并把他们从多个实现中解耦出来(来自百科)。是不是很晦涩呀,其实简单说来就是:提供者为框架的用户提供了多个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!