模板方法(Template Method)
模板方法能重复的使用代码逻辑,让所继承的子类实现的方法按照一定的逻辑顺序执行。
TemplatePatternDemo,主类
public class TemplatePatternDemo {
public static void main(String[] args) {
Game game = new Cricket();
game.play();
System.out.println();
game = new Football();
game.play();
}
}
Game抽象类
其中,play方法的final很重要,防止了子类覆写此方法,打乱了执行顺序。
public abstract class Game {
abstract void initialize();
abstract void startPlay();
abstract void endPlay();
//模板
public final void play(){
//初始化游戏
initialize();
//开始游戏
startPlay();
//结束游戏
endPlay();
}
}
Cricket子类
public class Cricket extends Game {
@Override
void endPlay() {
System.out.println("Cricket Game Finished!");
}
@Override
void initialize() {
System.out.println("Cricket Game Initialized! Start playing.");
}
@Override
void startPlay() {
System.out.println("Cricket Game Started. Enjoy the game!");
}
}
Football子类
public class Football extends Game {
@Override
void endPlay() {
System.out.println("Football Game Finished!");
}
@Override
void initialize() {
System.out.println("Football Game Initialized! Start playing.");
}
@Override
void startPlay() {
System.out.println("Football Game Started. Enjoy the game!");
}
}
解决模板方法子类泛滥:回调(callback)
啥是回调?
回调表示一段可执行的逻辑的引用(或指针),我们把该引用(或者指针)传递到另外一段逻辑(或者方法)里供这段逻辑适时调用。
数据库查询,会先查询全部的,然后选取要的内容,重新封装到结果集中。
如果根据每种情况都创建一个实现类,那么子类太多了。我们应用回调。
下面模拟数据库查询
先定义一个回调处理数据的接口
import java.sql.ResultSet;
public interface ResultSetHandler<T> {
public T handle(ResultSet rs);
}
创建查询数据库的类
这里的query方法有个参数是一个实现ResultSetHandler接口的对象,最后return的时候会调用这个对象里的handle方法
import java.sql.ResultSet;
public class SimpleJdbcQueryTemplate {
public <T> T query(String queryString , ResultSetHandler<T> rsHandler){
//处理逻辑,得到数据
// connection = getCollection();得到dbconnection
//stmt = connection.prepareStatement(queryString);
//...........
ResultSet rs = null;
//rs = stmt.excuteQuery();
//回调
return rsHandler.handle(rs);
}
}
这样就根据不同的查询语句,使用回调类处理查询结果。
import java.sql.ResultSet;
public class TestTemplate {
boolean called = new SimpleJdbcQueryTemplate().query("select * from db ", new ResultSetHandler<Boolean>() {
@Override
public Boolean handle(ResultSet rs) {
//处理逻辑
return true;
}
});
}