zoukankan      html  css  js  c++  java
  • 服务提供者框架


    参考: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)。

  • 相关阅读:
    Docker-MsSqlServer和安装版本异同
    ASP.NET Core入门
    开源网站.NETMVC+ Layui+SqlSugar+RestSharp
    SqlSugar ORM已经支持读写分离
    【开源框架】SqlSugarRepository 全库ORM 正式发布
    花几分钟搭建一个自已的GIT服务器
    [开源ORM] SqliteSugar 3.x .net Core版本成功上线
    N[开源].NET CORE与MySql更配, MySqlSugar ORM框架 3.x
    Dapper ORM VS SqlSugar ORM的 8场对决
    .NET 开源SqlServer ORM框架 SqlSugar 3.0 API
  • 原文地址:https://www.cnblogs.com/zoujiejun96/p/8778323.html
Copyright © 2011-2022 走看看