利用一个简单的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 操作数据库

服务提供者框架讲解 之 myJDBC的更多相关文章

  1. 谷歌Volley网络框架讲解——BasicNetwork类

    谷歌Volley网络框架讲解——BasicNetwork类 这个类是toolbox工具箱包里的,实现了Network接口. 先来看下Network这个interface,performRequest( ...

  2. 程序员的自我救赎---1.4.2: 核心框架讲解(BLL&Tool)

    <前言> <目录> (一) Winner2.0 框架基础分析 (二) 短信中心 (三)SSO单点登录 (四)PLSQL报表系统 (五)钱包系统 (六)GPU支付中心 (七)权限 ...

  3. 框架原理第一讲,熟悉常用的设计方式.(以MFC框架讲解)

    框架原理第一讲,熟悉常用的设计方式.(以MFC框架讲解) 一丶什么是框架,以及框架的作用 什么是框架? 框架,简而言之就是把东西封装好了,使用框架开发可以快速开发程序,例如MFC程序的双击写代码. 为 ...

  4. 程序员的自我救赎---1.4.3: 核心框架讲解(MVC)

    <前言> (一) Winner2.0 框架基础分析 (二)PLSQL报表系统 (三)SSO单点登录 (四) 短信中心与消息中心 (五)钱包系统 (六)GPU支付中心 (七)权限系统 (八) ...

  5. effective java笔记之java服务提供者框架

    博主是一名苦逼的大四实习生,现在java从业人员越来越多,面对的竞争越来越大,还没走出校园,就TM可能面临失业,而且对那些增删改查的业务毫无兴趣,于是决定提升自己,在实习期间的时间还是很充裕的,期间自 ...

  6. 框架原理第三讲,RTTCreate,运行时类型创建.(以MFC框架讲解)

    框架原理第三讲,RTTCreate,运行时类型创建.(以MFC框架讲解) 通过昨天的讲解,我们已经理解了运行时类型识别是什么. 比如  CObject * pthis = (Cobject *)Cre ...

  7. 框架原理第二讲,RTTI,运行时类型识别.(以MFC框架讲解)

    框架原理第二讲,RTTI,运行时类型识别.(以MFC框架讲解) 一丶什么是RTTI,以及RTTI怎么设计 通过第一讲,我们知道了怎么样升成一个窗口了,以及简单的消息循环. 第二讲则是主要讲解RTTI ...

  8. 程序员的自我救赎---1.4.1:核心框架讲解(DAL)

    <前言> (一) Winner2.0 框架基础分析 (二)PLSQL报表系统 (三)SSO单点登录 (四) 短信中心与消息中心 (五)钱包系统 (六)GPU支付中心 (七)权限系统 (八) ...

  9. 《Effective Java》笔记-服务提供者框架

    静态工厂方法返回的对象所属的类,在编写包含该静态工厂方法的类时可以不必存在.这种灵活的静态工厂方法构成了服务提供者框架(Service Provider Framework)的基础,例如JDBC AP ...

随机推荐

  1. 【原创】go语言学习(七)数组

    目录 数组定义 二维数组 数组拷贝.传参 数组定义 1. 数组是同一类型的元素集合. var a [3]int //定义一个数组 //Go中数组下标从0开始,因此⻓长度为n的数组下标范围:[0,n-1 ...

  2. 第九届蓝桥杯(A组填空题)

    1.标题:分数 1/1 + 1/2 + 1/4 + 1/8 + 1/16 + …. 每项是前一项的一半,如果一共有20项, 求这个和是多少,结果用分数表示出来. 类似: 3/2 当然,这只是加了前2项 ...

  3. linux 网络带宽和延时测试

    Linux下使用qperf命令来测试网络带宽和网络延迟 参考文章:https://access.redhat.com/solutions/2122681 若是没有安装qperf命令,请使用yum 安装 ...

  4. 将制定目录家到系统PATH环境变量中

    1.打开系统文件sudo vim/etc/profile,请输入root密码 2.在appendpath '/usr/local/sbin' appendpath '/usr/local/bin' a ...

  5. 说出Servlet的生命周期,并说出Servlet和CGI的区别。

    说出Servlet的生命周期,并说出Servlet和CGI的区别. 山治ZHrx5 | 浏览 1377 次 推荐于2016-09-16 22:39:19 最佳答案 Servlet的生命周期分为5个阶段 ...

  6. webapi接口上传大文件

    通过WebApi或者MVC模式的接口上传文件时,总数报错 413 Request Entity Too Large IIS 404 服务未找到 解决方法: 1. 在web.config文件下找到sys ...

  7. 走进JavaWeb技术世界7:Tomcat中的设计模式

    . 门面设计模式 门面设计模式在 Tomcat 中有多处使用,在 Request 和 Response 对象封装中.Standard Wrapper 到 ServletConfig 封装中.Appli ...

  8. 如何实现数组与List的相互转换

    List转数组:toArray(arraylist.size()方法 数组转List:Arrays的asList(a)方法 List<String> arrayList = new Arr ...

  9. npm package.json配置整理

    通过npm init 创建 package.json文件 参数: name:项目名字 version: 版本号 description: 项目介绍 main: 项目的入口文件 scripts: npm ...

  10. javaScript(拼写树形)+ajax请求,去后台查找数据

    第一步:页面加载完成时,利用jquery中的一函数,调用js方法,js方法,发送ajax请求,去后台查找父类权限集合,响应回来json格式的数据,对数据进行操作,往页面上添加内容 //页面初始化加载菜 ...