想必大家都用過apache 的DbUtils吧价卤,這個簡單的對JDBC的封裝小框架真的是非常非常的適合新手的學(xué)習(xí)呢弱卡。邏輯上也不是很復(fù)雜画株,難度剛剛好。 下面我就模仿它來實現(xiàn)一個字符串的處理小框架抛姑。
思路
我的思路是這樣的艳狐,根據(jù)DbUtils中的實現(xiàn)方式定硝,來進行模擬處理。
示例分析
@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));
}
// 記得用完數(shù)據(jù)庫的鏈接就要及時的關(guān)閉毫目!
DbUtils.close(conn);
System.out.println("成功差入10條數(shù)據(jù)蔬啡!");
}
從這里可以看出DbUtils使用了一個QueryRunner來實現(xiàn)業(yè)務(wù)邏輯的處理。所以待會我們也要這樣來實現(xiàn)镀虐。
QueryRunner內(nèi)部解析
從上面的例子中我們也可以看出箱蟆,真正起作用的是QueryRunner的回調(diào)方法。這種面向接口的使用方式值Java編程思想中最為經(jīng)典的一種方式刮便。我們應(yīng)該多多使用空猜。
根據(jù)ResultSetHandler接口,我們待會也會模擬一個這樣的實現(xiàn)恨旱。
分層思想
看似簡單的接口回調(diào)辈毯,實則蘊含大智慧。一種分層解決問題的最佳體現(xiàn)窖杀。
復(fù)雜的事情交給手下的人去做漓摩,自己只需要掌控大局即可。
這就是面向接口實現(xiàn)業(yè)務(wù)的好處入客,我們只需要繼承接口管毙,在實現(xiàn)類中完成相關(guān)的業(yè)務(wù)邏輯。即可桌硫!
模擬實現(xiàn)接口回調(diào)
回調(diào)接口
package callback;
/**
* 模擬實現(xiàn)的接口回調(diào)
*
* @author Administrator
*
*/
public interface ResultSetHandler {
/**
* 用于分配給實現(xiàn)類的抽象方法
*
* @param str
* @return
*/
public Object handler(String str);
}
接口的實現(xiàn)類
接口的實現(xiàn)類完全可以按照自己的需求來實現(xiàn)夭咬,下面羅列幾個常見的實現(xiàn)類。
- 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 {
/**
* 將字符串轉(zhuǎn)換為大寫方式來輸出
*/
@Override
public Object handler(String str) {
return str.toUpperCase();
}
}
- DownCaseHandler.java
package callback;
public class DownCaseHandler implements ResultSetHandler {
/**
* 將字符串轉(zhuǎn)換為小寫方式來輸出
*/
@Override
public Object handler(String str) {
return str.toLowerCase();
}
}
類QueryRunner的StrUtils實現(xiàn)
package callback;
public class StrUtils {
/**
* 模擬QueryRunner實現(xiàn)的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);
}
}
測試結(jié)果
Origin Str: aBcDEfghIjKLMnoPQrStuVwXyZ
Result Str: cDEfg
---------------------------------
Origin Str: aBcDEfghIjKLMnoPQrStuVwXyZ
Result Str: XyZ
---------------------------------
Origin Str: aBcDEfghIjKLMnoPQrStuVwXyZ
Result Str: ABCDEFGHIJKLMNOPQRSTUVWXYZ
---------------------------------
Origin Str: aBcDEfghIjKLMnoPQrStuVwXyZ
Result Str: abcdefghijklmnopqrstuvwxyz
總結(jié)
以模擬的方式來學(xué)習(xí)比較適合我卓舵,所以模擬DbUtils來簡單的實現(xiàn)自己的StrUtils,是一件非嘲蚰疲快樂的事情掏湾。從中我能感受到那些優(yōu)秀的框架設(shè)計人員的智慧,真的是讓人佩服肿嘲。真希望有一天自己也能成為那樣的大牛融击!
在這個接口回調(diào)的實例中,我最大的收獲就是面向接口的編程方式雳窟,以及復(fù)雜事情交給實現(xiàn)類去完成的“至簡”思想尊浪。