两个类内部几乎重复的代码
这时,我有两个类: UserHibernateDao
和TicketHibernateDao
:
import java.util.List; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import model.dao.Dao; import model.entity.User; public class UserDaoHibernate extends HibernateDaoSupport implements Dao { public User get(long id) { return getHibernateTemplate().get(User.class, id); } public void save(User user) { getHibernateTemplate().save(user); } public void remove(long id) { getHibernateTemplate().delete( getHibernateTemplate().get(User.class, id)); } }
第二个:
import java.util.List; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import model.dao.Dao; import model.entity.Ticket; public class TicketDaoHibernate extends HibernateDaoSupport implements Dao { public Ticket get(long id) { return getHibernateTemplate().get(Ticket.class, id); } public void save(Ticket ticket) { getHibernateTemplate().save(ticket); } public void remove(long id) { getHibernateTemplate().delete( getHibernateTemplate().get(Ticket.class, id)); } public void save(Ticket ticket) { getHibernateTemplate().saveOrUpdate(ticket); } }
我看到这两个类包含几乎相同的方法和方法实现。
我想,这不是很好。 你怎么看? 还是很正常的?
这样的东西应该适合你,它通常被称为“通用DAO模式”。
public abstract class BaseDaoHibernate extends HibernateDaoSupport implements Dao { private final Class entityType; protected BaseDaoHibernate(Class entityType) { this.entityType = entityType; } public T get(long id) { return getHibernateTemplate().get(entityType, id); } public void save(T entity) { getHibernateTemplate().save(entity); } public void remove(long id) { getHibernateTemplate().delete(get(id)); } }
接着:
public class TicketDaoHibernate extends BaseDaoHibernate { public TicketDaoHibernate() { super(Ticket.class); } }
和
public class UserDaoHibernate extends BaseDaoHibernate { public UserDaoHibernate() { super(User.class); } }
使用generics并阅读此文档。 这很棒。
将以下有用的方法添加到public abstract Dao
:
public Class getEntityClass() { if (entityClass == null) { Type type = getClass().getGenericSuperclass(); if (type instanceof ParameterizedType) { ParameterizedType paramType = (ParameterizedType) type; entityClass = (Class ) paramType.getActualTypeArguments()[0]; } else throw new IllegalArgumentException("Could not guess entity class"); } return entityClass; }
然后你的get
和remove
方法可以移动到Dao
并重写为:
public T get(long id) { return getHibernateTemplate().get(getEntityClass(), id); } public void remove(long id) { getHibernateTemplate().delete(get(id)); }