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

来源:互联网 发布:网络综合布线设计方案 编辑:程序博客网 时间:2024/05/28 23:20

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

服务提供者框架的组成:

服务接口(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 {@Overridepublic String getConnection() {return "获得MYSQL的连接";}}


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

3.服务提供者接口

/** * 服务提供者类 * function:负责实例化服务,并且注册到services中 */public class MySQLServiceProvider implements ServiceProvider {static {Services.RegisterProvider("MySQL", new MySQLServiceProvider());}@Overridepublic 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();}}}

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





0 0