服务提供者框架

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片段源代码

vscode 开发微信小程序环境配置

使用实体框架迁移时 SQL Server 连接抛出异常 - 添加代码片段

你必须知道的11个微前端框架

Android片段和依赖注入

常用Javascript代码片段集锦