服务提供者框架讲解 之 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 ...
随机推荐
- Java的 「 “ 结构体 ”」 与 「 “ 自定义排序 ” 」
Java里面的结构体可以靠class来实现,如果相对结构体进行排序,需要写一个接口,class 自定义的名字 implements Comparator<结构体(自己定义的class类的名字)& ...
- 在 Ubuntu 18.04 /centos7上安装 Python 3.7
扩展源安装 sudo apt update sudo apt install software-properties-common sudo add-apt-repository ppa:deadsn ...
- Java学习日记基础篇(四)——类,对象之成员变量,成员方法,构造方法
面向对象(Object Oriented) 一.面向对象杂谈 面向对象(Object Oriented),我的翻译是以物体为目标的,就是说编程的时候是建立一个物体,然后对这个物体进行操作. Java语 ...
- Java+Bigdata学习路线
Java+Bigdata学习路线 2019-05-28 07:04:33 @Auther:MrZhangxd STAGE 第一阶段:JAVA基础 |-第一阶段:JAVA基础 | |-可掌握的核心能力 ...
- hadoop3.1.1:找不到或无法加载主类 org.apache.hadoop.mapreduce.v2.app.MRAppMaster
yarn执行MapReduce任务时,找不到主类导致的 解决: 1.在命令行输入:hadoop classpath [hadoop@localhost ~]$ hadoop classpath /da ...
- idea出现Error configuring application listener of class org.springframework.web.context.ContextLoader
在IDEA中写spring mvc时出现Error configuring application listener of class org.springframework.web.context. ...
- spring bean 的作用域之间有什么区别
spring bean 的作用域之间有什么区别? spring容器中的bean可以分为五个范围.所有范围的名称都是说明的, 1.singleton:这种bean范围是默认的,这种范围确保不管接受到多个 ...
- WORD转HTML-python第三方包Mammoth(官方文档翻译)
Mammoth 官方 Mammoth可用于将.docx文档(比如由Microsoft Word创建的)转换为HTML.Mammoth致力于通过文档中的语义信息生成简洁的HTML,而忽略一些其他细节.例 ...
- Eclipse插件(导出UML图,打开文件资源管理器插件,静态代码分析工具PMD,在eclipse上安装插件)
目录 能够导出UML图的Eclipse插件 打开文件资源管理器插件 Java静态代码分析工具PMD 如何在eclipse上安装插件 JProfiler性能分析工具 从更新站点安装EclEmma 能够导 ...
- window.postMessage 跨窗口,跨iframe javascript 通信
同源通信 执行它们的页面位于具有相同的协议(http/https),端口(80/443),主机(通常为域名) 时,这两个脚本才能相互通信 大多数情况下,网站就是内部的域名,所以是同源通信,可以相互访问 ...