服务提供者框架讲解 之 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 ...
随机推荐
- OpenJudge 1.5.14 人口增长问题
描述 我国现有x亿人口,按照每年0.1%的增长速度,n年后将有多少人? 输入一行,包含两个整数x和n,分别是人口基数和年数,以单个空格分隔.输出输出最后的人口数,以亿为单位,保留到小数点后四位.1 & ...
- python3监控系统资源最终版(获取CPU,内存,磁盘,网卡等信息),返回json格式。
#!/usr/bin/env python3 #-*- coding:utf-8 -*- #create at 2018-12-07 'this is a system monitor scripts ...
- stdu1309(不老的传说)
题目链接:http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/1309.html 不老的传说问题 Ti ...
- myadmin不需要路劲提权之法
//觉得很典型的案例,就转载过来了.很多时候phpmyadmin都需要路劲才能写shell.否则拿到了myadmin也是无奈. 查看mysql版本 select version(); 版本是5.1 大 ...
- 双缓冲技术局部更新原理之派生自View
package com.loaderman.customviewdemo; import android.content.Context; import android.graphics.Canvas ...
- 自定义控件之canvas变换和裁剪
1.平移 //构造两个画笔,一个红色,一个绿色 Paint paint_green = generatePaint(Color.GREEN, Paint.Style.STROKE, 3); Paint ...
- opencv之dlib库人脸识别
基础知识 python知识: import os,shutil shutil.rmtree("C:\\Users\\yangwj\\Desktop\\test") #删除目录 os ...
- zblog上传安装主题插件不成功的原因和解决办法
最近有不少zblog用户反映在后台上传安装主题或者插件的时候出现了问题.本文就来尝试说明下这类问题的原因和解决办法. 首先来说说zblog主题或者插件的安装方法,一共有三种方式: 第一种是直接在网站后 ...
- 005-多线程-集合-Map-ConcurrentSkipListMap
一.概述 ConcurrentSkipListMap是线程安全的有序的哈希表,适用于高并发的场景. ConcurrentSkipListMap和TreeMap,它们虽然都是有序的哈希表.但是,第一,它 ...
- Java 5-11新特性的整理(转)
Java 5-11新特性的整理(转) 作者:拔剑少年 简书地址:https://www.jianshu.com/u/dad4d9675892博客地址:https://it18monkey.github ...