服务提供者架构是 指这样一个系统:系统提供一个服务标准,多个服务提供者根据自身不同实现这个服务标准形成服务实体,同一个服务标准下面可存在多个服务实体,系统提供注册 API供不同的服务提供者注册自身服务实体到系统中以让系统使用自己提供的服务,同时系统对外提供服务获取API将注册的不同服务实体提供给外部系统使 用。
最典型的服务提供者 架构就是JDBC,首先JDBC是个J2EE标准,SUN只提供了各种规范和接口(一流公司玩标准、二流公司玩服务、三流公司玩产品、四流公司玩外包), 具体实现由各个数据库厂商来完成,我们在程序中获取Connection就相当于获取服务,服务首先由各个数据库服务厂商注册到JDBC的大容器中,然后 程序再通过服务获取API在JDBC大容器中获取Conection。
服务提供者架构的模型如下:
结 合JDBC不难理解。首先中央系统制定服务标准,各个服务提供者遵照服务标准去实现自己的服务,为了能够让中央系统使用自己生产的服务,服务提供需要将服 务注册到中央系统中,中央系统会讲每个服务提供者的服务存在的一个服务容器中。当外部系统通过中央系统提供的服务获取API来获取服务时,中央系统会根据 相应参数去服务容器中检索,如果存在匹配的服务就返回。
实现代码如下,服务管理者类:
1 public class ServiceManager { 2 3 private ServiceManager(){} 4 5 private static final Map<String, Provider> providers = new ConcurrentHashMap<String, Provider>(); 6 7 public static final String DEFAULT_PROVIDER_NAME = "mysql"; 8 9 public static void registerDefaultProvider(Provider p){ 10 registerProvider(DEFAULT_PROVIDER_NAME, p); 11 } 12 13 public static void registerProvider(String name, Provider p){ 14 if(name != null && !"".equals(name.trim()) && p != null){ 15 providers.put(name, p); 16 } 17 } 18 19 public static Service getService(){ 20 return getService(DEFAULT_PROVIDER_NAME); 21 } 22 23 public static Service getService(String name){ 24 Service service = null; 25 if(name != null && !"".equals(name.trim())){ 26 Provider p = providers.get(name); 27 if(p != null){ 28 service = p.provideService(); 29 }else{ 30 throw new IllegalArgumentException("This Service is not register in System."); 31 } 32 } 33 return service; 34 } 35 36 }
测试类:
1 public class TestApp { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 Provider p = new MysqlProvider(); 8 ServiceManager.registerDefaultProvider(p); 9 ServiceManager.getService().profile(); 10 11 p = new OracleProvider(); 12 ServiceManager.registerProvider("oracle", p); 13 ServiceManager.getService("oracle").profile(); 14 } 15 16 }
Service是服务接口,Service接口一个profile方法用来显示Service的具体信息。
Provider是服务提供者接口,有Mysql和Oracle两个实现。ServiceManager是中央控制系统,服务提供者注册和获取服务都由它来完成。