版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Little_Red_Rose/article/details/83588578
服务提供者框架
服务提供者框架(Service Provider Framework):多个服务提供者实现一个服务,系统为服务提供者的客户端提供多个实现,并把他们从多个实现中解耦出来;例如JDBC,JMS。
服务组件
- Service Interface: 服务接口,将服务通过抽接口统一声明,供客户端调用,由各个服务提供者具体实现。
- Service Sccess API: 服务访问API,用户客户端获取相应的服务。
- Provider Registration API: 这是系统用来注册实现的,让客户端访问他们的;注册系统服务提供者,使得客户端可以访问它的实现。
- Service Provider Interface: 这些服务提供者负责创建其服务实现的实例(非必须);如果没有提供该接口,就按照类名称注册,并通过反射的方式进行实例化。
JDBC举例
- Connection
- DriverManager.getConnection
- DriverManager.registerDriver
- Driver
代码举例
本处代码拿盐的生产举例。
盐(Service Interface)
/*
* @author zhangehb
* @function 食盐
* Since 20.18-10-31
* 服务接口,将服务通过抽象统一声明,供客户端调用、由各个服务提供者具体实现。
* */
public interface Salt {
/**
* 功能描述: 加点
* @param:
* @return:
* @since: 1.0.0
* @Author:zhangehb
* @Date: 2018/10/31 16:33
*/
void addIodine();
}
海盐与内陆盐代表服务提供者自己的实现
/**
* @ClassName BaySalt
* @Description TODO 海盐
* @Author zhangehb
* @Date 2018/10/31 16:34
* @Version 1.0
*/
public class BaySalt implements Salt{
@Override
public void addIodine() {
// 加碘操作
System.out.println("海盐");
}
}
/**
* @ClassName InlandSalt
* @Description TODO 内陆盐
* @Author zhangehb
* @Date 2018/10/31 16:37
* @Version 1.0
*/
public class InlandSalt implements Salt {
@Override
public void addIodine() {
// 加碘操作
System.out.println("内陆盐");
}
}
服务访问API(Service Provider Interface)
/*
* 服务提供者接口,这些服务提供者负责创建其服务实现的实例
* */
public interface SaltProvider {
Salt getSalt();
}
提供者实现
/**
* @ClassName BaySaltProvider
* @Description TODO 海盐厂商
* @Author zhangehb
* @Date 2018/10/31 16:42
* @Version 1.0
*/
public class BaySaltProvider implements SaltProvider {
/*
* 去盐司登记
* */
static {
SaltManager.registerProvider("baySaltProvider", new BaySaltProvider());
}
@Override
public Salt getSalt() {
// 太阳晒
return new BaySalt();
}
}
/**
* @ClassName InlandSaltProvider
* @Description TODO
* @Author zhangehb
* @Date 2018/10/31 16:44
* @Version 1.0
*/
public class InlandSaltProvider implements SaltProvider {
/*
* 去盐司登记
*
* */
static {
SaltManager.registerProvider("inlandSaltProvider", new InlandSaltProvider());
}
@Override
public Salt getSalt() {
// 用挖掘机挖
return new InlandSalt();
}
}
盐监司(Provider Registration API与Service Access API)
/**
* @ClassName SaltManager
* @Description TODO 盐监司
* @Author zhangehb
* @Date 2018/10/31 16:46
* @Version 1.0
*/
public class SaltManager {
/*
* 食盐生产厂家登记档案
* */
private static final Map<String,SaltProvider> PROVIDER_MAP = new ConcurrentHashMap<>();
/*
* 食盐厂商登记
* 服务提供者注册API,用于系统注册服务提供者,使得客户端可以访问它实现的服务。
* */
public static void registerProvider(String name,SaltProvider provider){
PROVIDER_MAP.put(name,provider);
}
/*
*
* 获取食盐
* 服务访问API,用户客户端获取相应的服务。
* */
public static Salt getSalt(String name){
SaltProvider saltProvider = PROVIDER_MAP.get(name);
if (saltProvider == null){
throw new IllegalArgumentException("No SaltProvider registered with name :"+name);
}
return saltProvider.getSalt();
}
}
客户端
/**
* @ClassName Test
* @Description TODO
* @Author zhangehb
* @Date 2018/10/31 16:53
* @Version 1.0
*/
public class Test {
public static void main(String[] args) throws ClassNotFoundException{
Class.forName("ServiceProviderFramework.InlandSaltProvider");
Salt salt = SaltManager.getSalt("inlandSaltProvider");
salt.addIodine();
}
}