服务提供者框架讲解 之 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 ...
随机推荐
- gcc/g++ 链接库的编译与链接
GCC编译步骤 gcc -E t1.c -o t1.i 预处理 gcc -S t1.i -o t1.s 转成汇编语言 gcc -c t1.s -o t1.o 转成机器码 gcc t1.o -o t1. ...
- P2822 组合数问题——巧用前缀和
P2822 组合数问题 求的是C(i,j)有多少个是k的倍数: 首先,求组合数是有技巧的, 用杨辉三角求组合数,爽的一批: 但是,这样只能得90分,两个点T了: 因为k是不变的,我们可以用前缀和的思想 ...
- 小程序开发--WePy框架
现如今mvvm框架如此火热,其核心思想即js逻辑层不直接操作DOM,只改变组件状态:而视图层则通过模板template进行渲染. 1.WePy项目的目录结构 ├── dist 小程序运行代码目录 ├─ ...
- 在 Arch 上Yaourt 使用这些替代品
1. aurman aurman 是最好的 AUR 助手之一,也能胜任 Yaourt 替代品的地位.它有非常类似于 pacman 的语法,可以支持所有的 pacman 操作.你可以搜索 AUR.解决包 ...
- 雪花算法(DELPHI实现)
雪花算法(DELPHI实现) 生成ID能够按照时间有序生成. 分布式系统内不会产生重复id(用workerId来做区分). 自增ID:对于数据敏感场景不宜使用,且不适合于分布式场景. GUID:采用无 ...
- mysql的配置文件解释
1 在执行mysqld命令时,下列配置会生效,即mysql服务启动时生效 [mysqld] character_set_server=utf8collation-server=utf8_general ...
- vue - 设置全局html背景
需求 有时候有些组件需要全局设置body背景,有些不需要在组件中设置就行了 解决思路 1. 全局设置可以是html,body,这里大家可以试一下,这两个只要其中一个设置了background,另一个的 ...
- python模块之request模块的理解
首先还是老生长谈,说说定义和作用,request模块是一个用于访问网络的模块,其实类似的模块还有很多,不在一一在这里解释.这么多的相似的模块为什么都说只有这个好用呢.因为他人性化.如果你学过urlli ...
- 8个华丽而实用的Java图表类库
8个华丽而实用的Java图表类库 转 https://www.300168.com/yidong/show-2744.html 核心提示:学习Java的同学注意了!!! 学习过程中遇到什么问题或者 ...
- 解决kali无法连接网络问题
键入 ifconfig -a 查看网卡 ,是否存在 键入 leafpad /etc/network/interfaces 查看其中是否有如下语句,没有添加上即可:auto eth0iface eth0 ...