服务提供者框架讲解 之 myJDBC

什么是 服务提供者框架

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

  • 服务接口
  • 服务提供者接口
  • 服务注册 API
  • 服务访问 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 操作数据库 ;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值