effective java Item01------服务提供者框架详解

本文详细介绍了服务提供者框架的概念、组成及其工作流程,包括服务接口、提供者注册API、服务访问API等关键组件,并通过具体实现展示了如何利用该框架实现不同数据库连接驱动的模拟。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

服务提供者框架:是只这样的一个框架,多个服务提供者实现一个服务,系统为服务提供者的客户端提供多个实现,并把他们从多个实例中解耦出来。

服务提供者框架的组成:

服务接口(Service Interface):提供者实现的接口,为服务实现者提供统一的抽象接口,换句话说是客户端调用的接口,由服务提供者实现。

提供者注册API(Provider Registeration API):服务提供者注册的API,用于注册服务提供者,客户端可以访问它实现的服务。

服务访问API(Service access API):访问API获取相应的服务。

服务提供者接口(Service Provider Interface ):服务提供者接口,这些服务提供者负责创建服务实现的实例。

具体实现一个实例:

1.服务接口

/**
 * 服务的接口
 * 此接口提供一组标准供客户端调用,多个服务提供者实现这个接口
 * */
public interface DatabseService {
	public String getConnection();
}
2.服务接口实现(两个)

public class MySQLService implements DatabseService {

	@Override
	public String getConnection() {
		return "获得MYSQL的连接";
	}

}


public class OracleService implements DatabseService {
	@Override
	public String getConnection() {
		return "获得Oracle连接";
	}
}

3.服务提供者接口

/**
 * 服务提供者类
 * function:负责实例化服务,并且注册到services中
 */
public class MySQLServiceProvider implements ServiceProvider {

	static {
		Services.RegisterProvider("MySQL", new MySQLServiceProvider());
	}
	@Override
	public DatabseService getDatabseService() {
		return new MySQLService();
	}

}

OracleProvider也必须的实现,根据需求去实现。如果扩展到其他数据库的连接(如DB等)


4.服务管理(此类中包含有服务提供者注册API和服务访问API)

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class Services {

	private Services(){};
	
	private static final Map<String, ServiceProvider> providers =
			new ConcurrentHashMap<String, ServiceProvider>();
	public static final String DEFAULT_PROVIDER_NAME="MySQL";
	
	/*服务提供者注册方法*/
	public static void RegisterDeafultProvider(ServiceProvider p){
		providers.put(DEFAULT_PROVIDER_NAME, p);
	}
	
	public static void RegisterProvider(String name ,ServiceProvider p){
		providers.put(name, p);
	}
	
	/*服务访问API*/
	public static DatabseService newInstance(){
		return newInstance(DEFAULT_PROVIDER_NAME);
	}
	public static DatabseService newInstance(String name){
		ServiceProvider p = providers.get(name);
		if(p==null)
			throw new IllegalArgumentException("No Provider registered with name"+name);
		return p.getDatabseService();
	}
}

5.测试类:

public class Test {

	public static void main(String[] args) {
		try {
			Class.forName("org.effectivejava.examples.chapter02.serviceFramework.MySQLServiceProvider");
			DatabseService ds = Services.newInstance("MySQL");
			
			Class.forName("org.effectivejava.examples.chapter02.serviceFramework.OracleProvider");
			try{
				DatabseService dsa = Services.newInstance("Oracle");
				System.out.println(dsa.getConnection());
			}catch(Exception e){
				e.printStackTrace();
			}
			System.out.println(ds.getConnection());
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
	}
}

这就是模拟各种数据库连接驱动的实现过程。数据库的驱动就是一个服务提供者框架。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值