java设计模式--模板方法

1.模板方法定义

模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

2.模板方法的类图

如图,一个简单的汽车实例。实例的代码如下:

定义一个汽车抽象模型的类。

public abstract class CarModel {
	public abstract void start(); //发动	
	public abstract void stop(); //停止
	public abstract void alarm(); //轰鸣
	public abstract void engineBoom();
    /*如果定义成抽象类,子类继承中要实现方法。每个汽车都要同样的运行方法.代码重复,
      所以定义在抽象类中非抽象方法。 */                         
	final public void run(){  //用final修饰防止子类进行更改。
		this.start();
		this.stop();
		this.alarm();
		this.engineBoom();
	};
}

用两个具体的汽车来继承汽车模型,代码如下:

public class Car1 extends CarModel{
	
	public void start() {
		System.out.println("H1启动");
		
	}

	public void stop() {
		System.out.println("H1停止");
	}

	public void alarm() {
		System.out.println("H1鸣笛");
	}

	public void engineBoom() {
		System.out.println("H1发动机轰鸣");
	}

}

public class Car2 extends CarModel{

	public void start() {
		System.out.println("H2启动");
		
	}

	public void stop() {
		System.out.println("H2停止");
	}

	public void alarm() {
		System.out.println("H2鸣笛");
	}

	public void engineBoom() {
		System.out.println("H2发动机轰鸣");
	}
}

public static void main(String[] args) throws IOException {
		Car1 c1 = new Car1();
		c1.run();
	}

H1启动
H1停止
H1鸣笛
H1发动机轰鸣

用测试类测试下,可以直接拿来用,这就是一个简单的模板方法。

3.模板方法典型的应用实例

public class JDBCDemo5 {
	public static void main(String[] args) {
		Connection conn = null;
		try {
			conn = DBUtil.getConnection();
			Statement state = conn.createStatement();
			String sql = "SELECT id,username,password,email,account " +
				"FROM userinfo_fancq";
			ResultSet rs = state.executeQuery(sql);
			/*
			 * 通过结果集获取元数据
			 */
			ResultSetMetaData rsmd = rs.getMetaData();
			/*
			 * 通过元数据查看结果集中总共有多少个字段?
			 */
			int colCount = rsmd.getColumnCount();
			for(int i=1;i<=colCount;i++){
				String colName = rsmd.getColumnName(i);
				System.out.println(colName);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally{
			if(conn != null){
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

上面的典型案例分析:

1. 获取数据库连接(不可变)

2. 执行sql语句(不可变)

3. 查询出来的字段(根据sql语句可变)

4. 处理异常(不可变)

5. 关闭连接释放资源(不可变)

用模板方式的代码结构如下:

public abstract class JdbcTemplate {

	private Connection con;
	
	private Statement state;
	
	@Autowired
	private DataSource dataSource;
	
	private ResultSet resultSet;
	
	private ResultSetMetaData data;
	
	public void getStatement(String sql) throws SQLException{
		con = dataSource.getConnection();
		state = con.createStatement();
		resultSet = state.executeQuery(sql);
	}
	
	private void releaseResources() throws SQLException {
	    if (resultSet != null)
	            resultSet.close();
	    if (state != null)
	        	state.close();
        if (con != null)
	            con.close();
	}
	
	 protected abstract void getColumn(ResultSet resultSet) throws SQLException;
	 
	 public final void getOperation(String sql)throws SQLException{ 
		 getStatement(sql);
		 releaseResources();
		 getColumn(resultSet);
	 }
}

public class JdbcCreateEntity extends JdbcTemplate{

	@Override
	protected void getColumn(ResultSet resultSet) throws SQLException {
		/*
		 * 通过结果集获取元数据
		 */
		ResultSetMetaData rsmd = resultSet.getMetaData();
		/*
		 * 通过元数据查看结果集中总共有多少个字段?
		 */
		int colCount = rsmd.getColumnCount();
		
		for(int i=1;i<=colCount;i++){
			String colName = rsmd.getColumnName(i);
			System.out.println(colName);
		}
			
	}
	
}

jdbc一个简单的模板模式。仅供方便理解。

 

4.模板方法的优点和缺点

 1、优点

  (1)、算法只存在于一个地方,也就是在父类中,容易修改。需要修改算法时,只要修改父类的模板方法或者已经实现的某些步骤,子类就会继承这些修改。

  (2)、实现了最大化代码复用。父类的模板方法和已实现的某些步骤会被子类继承而直接使用。

  (3)、既统一了算法,也提供了很大的灵活性。父类的模板方法确保了算法的结构保持不变,同时由子类提供部分步骤的实现。

  (4)、提供了一个基本框架,容易扩展子类。模板方法有框架控制如何做事情,而由使用框架的人指定框架算法中每个步骤的细节。子类只要继承父类,实现抽象方法,就可以使用父类的算法。

  2、缺点

  (1)、模板方法使用继承方式复用代码,如果要在基本算法里面增加一个步骤,而该步骤是抽象的话,每个子类都要修改代码,实现这个步骤。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值