模拟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 下拉上拉第三 ...
随机推荐
- Logistic Regression vs Naive Bayes
相同 逻辑回归和朴素贝叶斯都是对条件概率\(P(X|y)\)进行建模,使得最终的分类结果有很好的解释性. 不同 具体流程 逻辑回归: 假设\(P(y=1|X)\)满足逻辑函数\(h(z)=1/1+ex ...
- 以太坊如何估计计算gas?
以太坊如何估计估算计算gas?Etherscan上transaction info中有个gas used by txn,结果跟remix给的结果以及geth中getTransactionReceipt ...
- STL deque
STL之deque容器详解 Deque 容器 deque容器是C++标准模版库(STL,Standard Template Library)中的部分内容.deque容器类与vector类似,支持随 ...
- luogu2252 取石子游戏
题目描述 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后把石子全部取完 ...
- [NOI2016]循环之美
Description 牛牛是一个热爱算法设计的高中生.在他设计的算法中,常常会使用带小数的数进行计算.牛牛认为,如果在 k 进制下,一个数的小数部分是纯循环的,那么它就是美的.现在,牛牛想知道:对 ...
- 洛谷mNOIP模拟赛Day1-斐波那契
题目背景 大样例下发链接:http://pan.baidu.com/s/1c0LbQ2 密码:jigg 题目描述 小 C 养了一些很可爱的兔子. 有一天,小 C 突然发现兔子们都是严格按照伟大的数学家 ...
- JS 实现点击页面任意位置隐藏div、span
通过调用下面的 showhidden(“标签ID”) 显示div/span/…等标签内容,可以实现点击页面任意地方再次隐藏该标签内容,而showhidden(“标签ID”,”nohidden”)可保存 ...
- 遗传算法:N皇后
N皇后问题描述 N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行.同一列.同一斜线上的皇后都会自动攻击). 遗传算法 遗传算法是局部束搜索的变形: 与自 ...
- Ajax来实现下拉框省市区三级联动效果(服务端基于express)
//服务端JS代码: //提供服务端的处理 const express = require('express'); const fs = require('fs'); const app = expr ...
- hash数组快速查找一个字符串中出现最多的字符,并统计出现的次数
如何快速查找一个字符串中出现最多的字符,并统计出现的次数? 可以使用hash数组,也就是关联数组实现快速查找功能. function seek(str) { var hash = []; var ma ...