服务提供者框架
Posted zoujiejun96
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了服务提供者框架相关的知识,希望对你有一定的参考价值。
参考:http://liwenshui322.iteye.com/blog/1267202
由于静态工厂方法返回的对象所属的类,在编写包含该静态工厂方法的类时可以不必存在。这种灵活的静态工厂方法构成了服务提供者框架的基础,如:JDBC
服务提供者框架是指这样一个系统:多个服务提供者实现一个服务,系统为服务提供者的客户端提供多个实现,并把他们从多个实现中解耦出来。
服务提供者框架各组件关系如下:
1.服务具体实现类和服务提供者实现类是服务提供者自己去实现。以JDBC为例,这2个模块由具体的数据库提供商来实现。
2.其他三个模块是java对数据库提供商怎么实现上面2个模块的一个约束。比如:提供服务者实现类必须实现服务提供者接口。才能成功注册到服务提供者注册类。以JDBC为例,所有的数据库提供商只需要按照接口里面定义的规则来操作,都能成功地使java连上他们的数据库。
以JDBC为例:
在Java中连接mysql的源码如下:
Class.forName("com.jdbc.mysql.Driver"); Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","123");
从这个地方可以看出:只需要更换数据库的驱动名称与建立连接的URL,用户名等信息,就可以完全切换到另外一个数据库。数据库底部怎么操作的我们不清楚,也没必要清楚。我们获取的连接对象是Connection,查看java.sql.Connection这个类,会发现它只是一个接口。我们得到的只是一个接口,怎么可能能够操作数据库呢?其实这里得到的不是Connection接口,而是它的一个实现类,只是对于客户端不可见而已。这可能就是所谓的面向接口编程,客户端只需要知道它该知道的信息,服务端告诉客户端,你可以调用哪些方法。至于具体方法怎么实现是服务端的事情,客户端就不需要管,也不需要知道了。
自己写一个服务提供者框架,以广州地铁进出控制为例:
现有两种模式:
1.使用羊城通,进出刷卡。
2.使用单程票,进入刷单程票,出站回收单程票。
现在把两种模式分别分给 A公司做羊城通的部分 、B公司做单程票的部分,系统提供 服务定义接口、服务提供者接口、服务提供者注册类, 地铁闸机实现客户端调用功能。
服务定义接口:
1 /** 2 * 地铁服务接口 3 * 服务定义接口 4 */ 5 public interface SubwayInterface { 6 boolean in(); 7 boolean out(); 8 }
服务提供者接口:
/** * 地铁服务提供者接口 * 服务提供者接口 */ public interface SubwayProviderInterface { SubwayInterface getInstance(); }
服务提供者注册类:
1 /** 2 * 地铁服务注册类 3 * 服务提供者注册类 4 */ 5 public class ServiceManager { 6 private static final Map<String,SubwayProviderInterface> providers = new ConcurrentHashMap<>(); 7 8 private ServiceManager(){ 9 10 } 11 12 public static void registerProvider(String name, SubwayProviderInterface provider){ 13 providers.put(name,provider); 14 } 15 16 public static SubwayInterface getService(String name){ 17 SubwayProviderInterface provider = providers.get(name); 18 19 if(provider == null){ 20 throw new IllegalArgumentException("null"); 21 } 22 return provider.getInstance(); 23 } 24 }
A公司提供的服务提供者实现类:
/** * 服务提供者实现类 1 */ public class SubwayProviderCardImpl implements SubwayProviderInterface { static { ServiceManager.registerProvider("羊城通", new SubwayProviderCardImpl()); } @Override public SubwayInterface getInstance() { return new SubwayCardImpl(); }
}
A公司提供的服务具体实现类:
1 package com.zoujiejun.serviceproviderframework.card; 2 3 4 import com.zoujiejun.serviceproviderframework.service.SubwayInterface; 5 6 /** 7 * 通过羊城通使用地铁服务 8 * 服务具体实现类 1 9 */ 10 public class SubwayCardImpl implements SubwayInterface { 11 @Override 12 public boolean in() { 13 System.out.println("通过羊城通进入地铁"); 14 /* 15 具体实现逻辑 16 */ 17 return false; 18 } 19 20 @Override 21 public boolean out() { 22 System.out.println("通过羊城通出站"); 23 /* 24 具体逻辑 25 */ 26 return false; 27 } 28 }
B公司提供的服务提供者实现类:
1 /** 2 * 服务提供者实现类 2 3 */ 4 public class SubwayProviderTicketImpl implements SubwayProviderInterface { 5 6 static { 7 ServiceManager.registerProvider("单程票", new SubwayProviderTicketImpl()); 8 } 9 10 @Override 11 public SubwayInterface getInstance() { 12 return new SubwayTicketImpl(); 13 } 14 }
B公司提供的具体服务实现类:
1 /** 2 * 通过单程票使用广州地铁服务 3 * 服务具体实现类 2 4 */ 5 public class SubwayTicketImpl implements SubwayInterface { 6 @Override 7 public boolean in() { 8 System.out.println("通过单程票进入地铁"); 9 return false; 10 } 11 12 @Override 13 public boolean out() { 14 System.out.println("通过单程票出站,回收单程票"); 15 return false; 16 } 17 }
闸机客户端测试类:
1 /** 2 * 客户端测试类 3 */ 4 public class Test { 5 public static void main(String[] args) throws ClassNotFoundException { 6 7 //使用 单程票公司提供的服务 8 Class.forName("com.zoujiejun.serviceproviderframework.ticket.SubwayProviderTicketImpl"); 9 SubwayInterface subway = ServiceManager.getService("单程票"); 10 subway.in(); 11 subway.out(); 12 13 //使用 羊城通公司提供的服务 14 Class.forName("com.zoujiejun.serviceproviderframework.card.SubwayProviderCardImpl"); 15 SubwayInterface subway2 = ServiceManager.getService("羊城通"); 16 subway2.in(); 17 subway2.out(); 18 } 19 }
服务提供者中的三个重要组件:服务接口(Service Interface)、提供者注册API(Provider Registration API)、服务访问API(Service Access API),第四个可选组件服务提供者接口(Service Provider Interface)。
以上是关于服务提供者框架的主要内容,如果未能解决你的问题,请参考以下文章
text 来自Codyhouse框架的Browserlist片段源代码