设计模式——模板模式

模板方法(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;
        }
    });
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值