服务提供者框架讲解 之 myJDBC
利用一个简单的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 操作数据库 ;
服务提供者框架讲解 之 myJDBC的更多相关文章
- 谷歌Volley网络框架讲解——BasicNetwork类
谷歌Volley网络框架讲解——BasicNetwork类 这个类是toolbox工具箱包里的,实现了Network接口. 先来看下Network这个interface,performRequest( ...
- 程序员的自我救赎---1.4.2: 核心框架讲解(BLL&Tool)
<前言> <目录> (一) Winner2.0 框架基础分析 (二) 短信中心 (三)SSO单点登录 (四)PLSQL报表系统 (五)钱包系统 (六)GPU支付中心 (七)权限 ...
- 框架原理第一讲,熟悉常用的设计方式.(以MFC框架讲解)
框架原理第一讲,熟悉常用的设计方式.(以MFC框架讲解) 一丶什么是框架,以及框架的作用 什么是框架? 框架,简而言之就是把东西封装好了,使用框架开发可以快速开发程序,例如MFC程序的双击写代码. 为 ...
- 程序员的自我救赎---1.4.3: 核心框架讲解(MVC)
<前言> (一) Winner2.0 框架基础分析 (二)PLSQL报表系统 (三)SSO单点登录 (四) 短信中心与消息中心 (五)钱包系统 (六)GPU支付中心 (七)权限系统 (八) ...
- effective java笔记之java服务提供者框架
博主是一名苦逼的大四实习生,现在java从业人员越来越多,面对的竞争越来越大,还没走出校园,就TM可能面临失业,而且对那些增删改查的业务毫无兴趣,于是决定提升自己,在实习期间的时间还是很充裕的,期间自 ...
- 框架原理第三讲,RTTCreate,运行时类型创建.(以MFC框架讲解)
框架原理第三讲,RTTCreate,运行时类型创建.(以MFC框架讲解) 通过昨天的讲解,我们已经理解了运行时类型识别是什么. 比如 CObject * pthis = (Cobject *)Cre ...
- 框架原理第二讲,RTTI,运行时类型识别.(以MFC框架讲解)
框架原理第二讲,RTTI,运行时类型识别.(以MFC框架讲解) 一丶什么是RTTI,以及RTTI怎么设计 通过第一讲,我们知道了怎么样升成一个窗口了,以及简单的消息循环. 第二讲则是主要讲解RTTI ...
- 程序员的自我救赎---1.4.1:核心框架讲解(DAL)
<前言> (一) Winner2.0 框架基础分析 (二)PLSQL报表系统 (三)SSO单点登录 (四) 短信中心与消息中心 (五)钱包系统 (六)GPU支付中心 (七)权限系统 (八) ...
- 《Effective Java》笔记-服务提供者框架
静态工厂方法返回的对象所属的类,在编写包含该静态工厂方法的类时可以不必存在.这种灵活的静态工厂方法构成了服务提供者框架(Service Provider Framework)的基础,例如JDBC AP ...
随机推荐
- 【原创】go语言之打印目录
package main import ( "fmt" "io/ioutil" "log" ) func listFiles(dirname ...
- mysql PS1个性化
method ) $ export MYSQL_PS1="\u@\h [\d]> " method ) mysql> prompt \u@\h [\d]> met ...
- 迭代器Iterator、for循环遍历、泛型
java.util.Collection接口 是集合的最顶层的接口,定义了集合共性的方法 接口无法直接创建对象,使用多态的方式创建对象 Collection<集合中的数据类型(泛型)> c ...
- GCC编译流程及常用编辑命令
GCC 编译器在编译一个C语言程序时需要经过以下 4 步: 将C语言源程序预处理,生成.i文件. 预处理后的.i文件编译成为汇编语言,生成.s文件. 将汇编语言文件经过汇编,生成目标文件.o文件. 将 ...
- app 爬虫
https://mp.weixin.qq.com/s/ClYYfpvylQGlYYHDFBuKpA 唯品会舆情监控系统 姚彬炎 唯技术 2月26日
- 如何向Makefile传递参数?
答: 直接在make命令的后面加上参数,如: make HOST_CFLAGS=-I. 注意事项: HOST_CFLAGS变量将会替换相应Makefile中的HOST_CFLAGS,也就是Makefi ...
- LC 991. Broken Calculator
On a broken calculator that has a number showing on its display, we can perform two operations: Doub ...
- React vs. Angular vs. Vue
原文连接 历史 React是一个用于构建Web应用程序UI组件的JavaScript库. React由Facebook维护,许多领先的科技品牌在其开发环境中使用React. React被Faceboo ...
- Java高并发程序设计
一.并行世界 摩尔定律的失效,2004年秋季,Intel宣布彻底取消4GHz计划,CPU向多核心的发展,顶级计算机科学家唐纳德丶尔文丶克努斯评价:在我看来,这种现象(并发)或多或少是由于硬件设计者已经 ...
- java-selenium 框架例子
package mavenweb2; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.o ...