模拟DbUtils实现接口回调机制
想必大家都用过apache 的DbUtils吧,这个简单的对JDBC的封装小框架真的是非常非常的适合新手的学习呢。逻辑上也不是很复杂,难度刚刚好。 下面我就模仿它来实现一个字符串的处理小框架。
思路
我的思路是这样的,根据DbUtils中的实现方式,来进行模拟处理。
示例分析
@Test
public void insert() throws Exception {
Connection conn = ConnTools.getConnection();
QueryRunner runner = new QueryRunner();
for (int i = 0; i < 10; i++) {
runner.update(conn, "insert into dbutil(name) values(?)", "Mark"+(1+i));
}
// 记得用完数据库的链接就要及时的关闭!
DbUtils.close(conn);
System.out.println("成功差入10条数据!");
}
从这里可以看出DbUtils使用了一个QueryRunner来实现业务逻辑的处理。所以待会我们也要这样来实现。
QueryRunner内部解析
从上面的例子中我们也可以看出,真正起作用的是QueryRunner的回调方法。这种面向接口的使用方式值Java编程思想中最为经典的一种方式。我们应该多多使用。
根据ResultSetHandler接口,我们待会也会模拟一个这样的实现。
分层思想
看似简单的接口回调,实则蕴含大智慧。一种分层解决问题的最佳体现。
复杂的事情交给手下的人去做,自己只需要掌控大局即可。
这就是面向接口实现业务的好处,我们只需要继承接口,在实现类中完成相关的业务逻辑。即可!
模拟实现接口回调
回调接口
package callback;
/**
* 模拟实现的接口回调
*
* @author Administrator
*
*/
public interface ResultSetHandler {
/**
* 用于分配给实现类的抽象方法
*
* @param str
* @return
*/
public Object handler(String str);
}
接口的实现类
接口的实现类完全可以按照自己的需求来实现,下面罗列几个常见的实现类。
- HeadHandler.java
package callback;
public class HeadHandler implements ResultSetHandler {
/**
* 截取字符串的前三个字符
*/
@Override
public Object handler(String str) {
return str.substring(str.length() - str.length() + 1, str.length() - str.length() + 3);
}
}
- TailHandler.java
package callback;
public class TailHandler implements ResultSetHandler {
/**
* 截取字符串的后三个字符
*/
@Override
public Object handler(String str) {
return str.subSequence(str.length() - 3, str.length());
}
}
- UpperCaseHandler.java
package callback;
public class UpperCaseHandler implements ResultSetHandler {
/**
* 将字符串转换为大写方式来输出
*/
@Override
public Object handler(String str) {
return str.toUpperCase();
}
}
- DownCaseHandler.java
package callback;
public class DownCaseHandler implements ResultSetHandler {
/**
* 将字符串转换为小写方式来输出
*/
@Override
public Object handler(String str) {
return str.toLowerCase();
}
}
类QueryRunner的StrUtils实现
package callback;
public class StrUtils {
/**
* 模拟QueryRunner实现的StrUtils,大管家
*
* @param origin
* @param handler
* @return
*/
public static Object query(String origin, ResultSetHandler handler) {
return handler.handler(origin);
}
}
测试
测试类代码
package callback;
public class Test {
public static void main(String[] args) {
String testStr = "aBcDEfghIjKLMnoPQrStuVwXyZ";
String result = (String) StrUtils.query(testStr, new HeadHandler());
System.out.println("Origin Str: " + testStr);
System.out.println("Result Str: " + result);
System.out.println("---------------------------------");
result = (String) StrUtils.query(testStr, new TailHandler());
System.out.println("Origin Str: " + testStr);
System.out.println("Result Str: " + result);
System.out.println("---------------------------------");
result = (String) StrUtils.query(testStr, new UpperCaseHandler());
System.out.println("Origin Str: " + testStr);
System.out.println("Result Str: " + result);
System.out.println("---------------------------------");
result = (String) StrUtils.query(testStr, new DownCaseHandler());
System.out.println("Origin Str: " + testStr);
System.out.println("Result Str: " + result);
}
}
测试结果
Origin Str: aBcDEfghIjKLMnoPQrStuVwXyZ
Result Str: cDEfg
---------------------------------
Origin Str: aBcDEfghIjKLMnoPQrStuVwXyZ
Result Str: XyZ
---------------------------------
Origin Str: aBcDEfghIjKLMnoPQrStuVwXyZ
Result Str: ABCDEFGHIJKLMNOPQRSTUVWXYZ
---------------------------------
Origin Str: aBcDEfghIjKLMnoPQrStuVwXyZ
Result Str: abcdefghijklmnopqrstuvwxyz
总结
以模拟的方式来学习比较适合我,所以模拟DbUtils来简单的实现自己的StrUtils,是一件非常快乐的事情。从中我能感受到那些优秀的框架设计人员的智慧,真的是让人佩服。真希望有一天自己也能成为那样的大牛!
在这个接口回调的实例中,我最大的收获就是面向接口的编程方式,以及复杂事情交给实现类去完成的“至简”思想。
模拟DbUtils实现接口回调机制的更多相关文章
- (转)Android之接口回调机制
开发中,接口回调是我们经常用到的. 接口回调的意思即,注册之后并不立马执行,而在某个时机触发执行. 举个例子: A有一个问题不会,他去问B,B暂时解决不出来,B说,等我(B)解决了再告诉你(A)此时A ...
- 弄明白Android 接口回调机制
以前对于这个机制理解不够深刻,现在重新整理下思路. 一.建模 我理解的接口回调就是,我这个类实现了一个接口里的方法doSomething,然后注册到你这里,然后我就去做别的事情去了,你在某个触发的时机 ...
- Java接口回调机制
一.前言 最近在看android Fragment与Activity进行数据传递的部分,看到了接口回调的内容,今天来总结一下. 二.回调的含义和用途 1.什么是回调? 一般来说,模块之间都存在一定的调 ...
- Android接口回调机制
开发中,接口回调是我们经常用到的. 接口回调的意思即,注册之后并不立马执行,而在某个时机触发执行. 举个例子: A有一个问题不会,他去问B,B暂时解决不出来,B说,等我(B)解决了再告诉你(A)此时A ...
- 关于android接口回调机制
http://www.cnblogs.com/JohnTsai/p/3975022.html http://www.zhihu.com/question/19801131 In my previous ...
- 深入浅出: Java回调机制(异步)
一.什么是回调 回调,回调.要先有调用,才有调用者和被调用者之间的回调.所以在百度百科中是这样的: 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调和异步调用. 回调 ...
- Android 中的接口回调
http://blog.csdn.net/wangjinyu501/article/details/22052187 在Android中到处可见接口回调机制,尤其是UI事件处理方面.举一个最常见的 ...
- Android实战之 万能的接口回调
转载请标明原地址:http://blog.csdn.net/gaolei1201/article/details/47084111 前言:本人也算是自学"成才",呵呵,大学时尽管学 ...
- 模拟QQ侧滑控件 实现三种界面切换效果(知识点:回调机制,解析网络json数据,fragment用法等)。
需要用到的lib包 :解析json gson包,从网络地址解析json数据成String字符串的异步网络解析工具AsyncHttpClient等 下载地址:点击下载 Xlistview 下拉上拉第三 ...
随机推荐
- bzoj 5289: [Hnoi2018]排列
Description Solution 首先注意到实际上约束关系构成了一棵树 考虑这个排列 \(p\),编号为 \(a[i]\) 的出现了,\(i\) 才可以出现 那么如果连边 \((a[i],i) ...
- ●POJ 1228 Grandpas Estate
题链: http://poj.org/problem?id=1228 题解: 计算几何,凸包 题意:给出一些点,求出其凸包,问是否是一个稳定的凸包. 稳定凸包:不能通过新加点使得原来凸包上的点(包括原 ...
- [bzoj4864][BeiJing 2017 Wc]神秘物质
来自FallDream的博客,未经允许,请勿转载,谢谢. 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子.这 一天, 小诚刚从研 ...
- solr6.6初探之查询篇
关于搜索与查询,首先我们来看一张图: 这张图说明了solr查询原理: 1.当通过solr发起查询的时候,引擎会选择一个RequestHandler(从字面意思上来说就是请求处理器)来进行查询处理 2. ...
- C语言程序第一次作业
(一)实验总结 1. 求圆面积和周长 (1)题目 输入圆的半径,计算圆的周长和面积. (2)流程图 (3)测试数据及运行结果 测试数据1:r=2 运行结果: (4)实验分析 没有问题 2.判断闰年 ( ...
- python3全栈开发-并发编程的多进程理论
一. 什么是进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 举例(单核+多道,实现多个进程的并发执行): duoduo在一个时间段内有很多任务要做:python备课的任务,写 ...
- web性能优化之---JavaScript中的无阻塞加载性能优化方案
一.js阻塞特性 JS 有个很无语的阻塞特性,就是当浏览器在执行JS 代码时,不能同时做其他任何事情,无论其代码是内嵌的还是外部的. 即<script>每次出现都会让页面等待脚本的解析和执 ...
- Nginx+tomcat配置集群负载均衡
开发的应用采用F5负载均衡交换机,F5将请求转发给5台hp unix服务器,每台服务器有多个webserver实例,对外提供web服务和socket等接口服务.之初,曾有个小小的疑问为何不采用开源的a ...
- Lintcode393 Best Time to Buy and Sell Stock IV solution 题解
[题目描述] Say you have an array for which the i th element is the price of a given stock on day i. Desi ...
- HTML入门知识
B/S:浏览器-服务器 C/S:客户端-服务器 更新麻烦 管理麻烦 PHP:基于BS结构进行项目开发的语言 ====================HTML:超文本标记语言 -- 控制网面内容CSS: ...