服务提供者框架讲解 之 myJDBC

利用一个简单的myJDBC,讲一下‘服务提供者框架’的思想.主要是思想

目录


什么是 服务提供者框架

服务提供者框架 有四个部分组成,这是老生常谈的话题了;

  1. 服务接口
  2. 服务提供者接口
  3. 服务注册 API
  4. 服务访问 API

大家都知道 JDBC 就是一个 服务提供者框架


代码讲解

还是用代码好讲解

服务接口

/**
 * 服务接口: 表示我们的框架提供什么服务,但是我们框架并不会去实现这个服务,交由服务提供者实现
 *
 * 这里提供操作数据库的服务
 */
interface OpeDatebase {
    void crud();
}

服务提供者接口

/**
 * 服务提供者接口:主要规定 服务提供者都必须实现这个接口,
 * 在注册的时候,统一用这个接口的名字去注册,便于框架管理这些服务提供者;
 * <p>
 * (这个接口是可选项,假如没有对外提供这个接口,则可以通过泛型、反射来完成注册的操作,但是反射的效率低下)
 */
interface Provide {
    OpeDatebase getOpeDatebase();
}

服务注册API、服务访问API

下面的是框架的主体代码,负责管理整个框架,它提供 服务注册 API服务访问 API

/**
 * 服务提供者框架的主体
 * <p>
 * JDBC 就是 一个服务提供者框架
 */
public class myJdbc {

    private static Map<String, Provide> map = new HashMap<>();

    /**
     * 服务注册接口
     * <p>
     * 为 服务提供者 提供注册API
     *
     * @param name    服务提供者的名字
     * @param provide  服务提供者的实现类
     */
    public static void registerProvider(String name, Provide provide) {
//        将服务提供者 注册到 框架里面
        map.put(name, provide);

    }

    /**
     * 服务提供 API
     *
     * @param name 服务的名字
     * @return
     */
    public static Provide getProvide(String name) {
        return map.get(name);
    }

}

静态工厂方法

写到这,就必须说下,静态工厂方法的优点之一(可以点击)就是可以灵活的返回原对象类型的子类型

服务者提供框架,也是 静态工厂方法 的一个体现;我们也发现了,我们的 myJDBC 已经写好了,但是服务的实现类,现在并没有写;这也是 静态工厂方法 的迷人之处 ;


服务实现类 – sql、oracle

sql


/**
 * 服务具体的实现类  --- sql
 */
class sql implements OpeDatebase {

    @Override
    public void crud() {
        System.out.println("SQL 操作数据库");
    }
}
---------------------------------------------------------------
/**
 * 服务具体的实现者的注册类  --- sql
 */
class sqlRegister implements Provide {

//  私有化构造器,使得只能 通过 加载类来进行注册
    private sqlRegister(){}

    static {
//        类加载的时候,就将它们注册到 myJdbc
        myJdbc.registerProvider("sqlRegister", new sqlRegister());
    }

    @Override
    public OpeDatebase getOpeDatebase() {
        return new sql();
    }
}

oracle

/**
 * 服务具体的实现类 --- oracle
 */
class oracle implements OpeDatebase {

    @Override
    public void crud() {
        System.out.println("oracle 操作数据库");
    }
}
----------------------------------------------
/**
 * 服务具体的实现者的注册类  --- oracle
 */
class oracleRegister implements Provide {


    private oracleRegister(){}

    static {
//        将它们注册到 myJdbc
        myJdbc.registerProvider("oracleRegister", new oracleRegister());
    }

    @Override
    public OpeDatebase getOpeDatebase() {
        return new oracle();
    }
}

测试一下 myJDBC

这里,我们只要更换 Class.forName("mooc.oracleRegister");,就会完成不同的注册 ;我们,完全可以写一个配置文件,来读取配置文件,加载不同的实现,这样就完全解耦了;

class test{
    @Test
    public  void test() throws ClassNotFoundException {
//        加载类,即完成注册,因为类的源码里面这样做了,其实JDBC的服务提供者也是这样做的
        Class.forName("mooc.oracleRegister");
//        我们获取我们注册的实例
        Provide provide = myJdbc.getProvide("oracleRegister") ;
        OpeDatebase opeDatebase = provide.getOpeDatebase();
        opeDatebase.crud();

    }
}

输出:oracle 操作数据库

猜你喜欢

转载自blog.csdn.net/youngyouth/article/details/80112680