这是老毕的解释:
当多个类出现相同功能,但功能主体不同,
这时可以进行向上抽取,只抽取功能定义,而不抽取功能主体
抽象:看不懂
抽象类的特点:
1、 抽象方法一定在抽象类中。
2、 抽象方法和抽象类都必须用abstract修饰符修饰
3、 抽象类不可以用new创建对象,因为调用抽象方法没有意义
4、 抽象类中的抽象方法要被调用,必须由子类重写所有的抽象方法后,建立子类对象调用。如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类
抽象方法可以写成非抽象的,抽象方法不一定是必须的。(因为子类在继承父类的时候,可以重写父类中的相关方法)。在抽象类中抽象方法不一定是必须的:抽象类中不一定有抽象方法,抽象方法一定是放在抽象类中的。
个人见解:抽象类一般是用来当模版使用的。在李勇的jdbc里面对于使用抽象类恰到好处。
相关代码:
public abstract class AbstractDao { public Object find(String sql, Object[] args) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { conn = JdbcUtils.getConnection(); ps = conn.prepareStatement(sql); for (int i = 0; i < args.length; i++) ps.setObject(i + 1, args); rs = ps.executeQuery(); Object obj = null; if (rs.next()) { obj = rowMapper(rs); } return obj; } catch (SQLException e) { throw new DaoException(e.getMessage(), e); } finally { JdbcUtils.free(rs, ps, conn); } } //将功能不同的地方抽象出来,由子类实现 abstract protected Object rowMapper(ResultSet rs) throws SQLException; public int update(String sql, Object[] args) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { conn = JdbcUtils.getConnection(); ps = conn.prepareStatement(sql); for (int i = 0; i < args.length; i++) ps.setObject(i + 1, args); return ps.executeUpdate(); } catch (SQLException e) { throw new DaoException(e.getMessage(), e); } finally { JdbcUtils.free(rs, ps, conn); } } }
调用抽取方法的模版UserDaoImpl.java package day3.cn.itcast.jdbc.dao.refactor; import java.sql.ResultSet; import java.sql.SQLException; import day3.cn.itcast.jdbc.domain.User; public class UserDaoImpl extends AbstractDao { public User findUser(String loginName, String password) { String sql = "select id, name, money, birthday from user where name=?"; Object[] args = new Object[] { loginName }; Object user = super.find(sql, args); return (User) user; } public String findUserName(int id) { String sql = "select name from user where id=?"; Object[] args = new Object[] { id }; Object user = super.find(sql, args); return ((User) user).getName(); } protected Object rowMapper1(ResultSet rs) throws SQLException { return rs.getString("name"); } //不同的AbstractDao实现类,实现rowMapper的方式不同 protected Object rowMapper(ResultSet rs) throws SQLException { User user = new User(); user.setId(rs.getInt("id")); user.setName(rs.getString("name")); user.setMoney(rs.getFloat("money")); user.setBirthday(rs.getDate("birthday")); return user; } public void delete(User user) { String sql = "delete from user where id=?"; Object[] args = new Object[] { user.getId() }; super.update(sql, args); } public void update(User user) { String sql = "update user set name=?, birthday=?, money=? where id=? "; Object[] args = new Object[] { user.getName(), user.getBirthday(), user.getMoney(), user.getId() }; super.update(sql, args); } }
|