两个类内部几乎重复的代码

这时,我有两个类: UserHibernateDaoTicketHibernateDao

 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; } 

然后你的getremove方法可以移动到Dao并重写为:

 public T get(long id) { return getHibernateTemplate().get(getEntityClass(), id); } public void remove(long id) { getHibernateTemplate().delete(get(id)); }