论坛首页 Java企业应用论坛

继承还是代理

浏览 12233 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (4)
作者 正文
   发表时间:2011-06-21  
刚看到一段DAO层代码

1. 接口代码

package com.hp.common.basedao;

import java.util.List;

/**
 * <p>基础接口</p>
 *
 */
public interface BaseService {

  
	/**
     * 添加
     * @param obj
     */
	public void save(Object obj);
	/**
	 * 修改
	 * @param obj
	 */
	public void update(Object obj);
	/**
	 * 列表
	 * @return list<?>
	 */
	public List<?> list();
	/**
	 * 查找
	 * @param id(int)
	 * @return object
	 */
	public Object find(int id);
	
		
}
		
		

2.接口实现

 
package com.hp.common.basedao;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import org.hibernate.Query;
import org.hibernate.SessionFactory;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;


/**
 * BaseService 接口实现</br>
 *  @see com.hp.common.basedao.BaseService
 *  @author 
 * 
 */

@Transactional
public class BaseServiceImpl implements BaseService{

	@Resource
	SessionFactory factory;
	private Object obj;

	
	/**
	 * 获取类名称
	 * 
	 * @param obj
	 * @return String
	 */
	public String getclname(Object obj) {

		return obj.getClass().getSimpleName();
	}

	/**
	 * 组装List hql语句
	 * 
	 * @param obj
	 * @return hql
	 */
	public String getHQL(Object obj) {
		String hql = "From " + getclname(obj);
		return hql;
	}

	public Object getObj() {
		return obj;
	}

	public void setObj(Object obj) {
		this.obj = obj;
	}

	public void del(int... ids) {
		for (int id : ids) {
			factory.getCurrentSession().delete(
					factory.getCurrentSession().load(obj.getClass(), id));
		}
	}

	
	public void del(String name, String param) {
		List<?> list = factory.getCurrentSession().createQuery(
				getHQL(obj) + " where " + name + "='" + param + "'").list();
		for (int i = 0; i < list.size(); i++) {
			factory.getCurrentSession().delete(list.get(i));
		}
	}

	public Object find(int id) {
		// factory.getCurrentSession().createQuery(getHQL(this.obj)+" where ");
		return null;
	}

	

	@Transactional(propagation = Propagation.NOT_SUPPORTED)
	public List<?> list() {

		return factory.getCurrentSession().createQuery(getHQL(obj)).list();
	}

	public void save(Object obj) {
		factory.getCurrentSession().persist(obj);
	}

	public void update(Object obj) {
		factory.getCurrentSession().merge(obj);
	}
	
}


3.某段继承代码

package com.hp.system.service;

import com.hp.common.basedao.BaseService;
/**
 * Extends BaseService</br>
 * {@link com.hp.common.basedao.BaseService}
 * @author 
 *
 */
public interface PubUsersService extends BaseService {
	
	
}

然后就是此继承的接口实现。

package com.hp.system.impl;

import javax.annotation.Resource;

import org.hibernate.SessionFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.hp.common.basedao.BaseServiceImpl;
import com.hp.system.bean.PubUsers;
import com.hp.system.service.PubUsersService;

@Service
@Transactional
public class PubUsersServiceImpl extends BaseServiceImpl implements
		PubUsersService {
	@Resource
	SessionFactory factory;
	PubUsers pubUsers=new PubUsers();
	public PubUsersServiceImpl() {
		super.setObj(pubUsers);
	}

}


我们有没有必要如此继承。且不说其中代码的拙劣之处。

想起.net中的代理机制。是不是在java中我们滥用了继承。


   发表时间:2011-06-21  
楼主 java也有代理的
0 请登录后投票
   发表时间:2011-06-22   最后修改:2011-06-22
dao跟service,最好是依赖关系,get,set注入。这从概念上说得过去。

当然,有的项目图省事,直接让service继承公共的dao。这儿的service只是名字上的service,其实还是个dao。
0 请登录后投票
   发表时间:2011-06-22  
nighthawk 写道
dao跟service,最好是依赖关系,get,set注入。这从概念上说得过去。

当然,有的项目图省事,直接让service继承公共的dao。这儿的service只是名字上的service,其实还是个dao。

同意 ,Dao跟service本身就不是在一个层次上 让他们继承实在有些牵强
耦合性上,合成/聚合更合适,更合理,虽然会增加复杂度。有人提出使用service+bo模式,bo即dao+业务方法 ,同样的,这样做会增加复杂度,业务方法中一般针对的是单一实体对象,如果是多个实体对象之间的,显然应该放入service。虽然复杂,但是个人认为可以提高编码效率 ,当然 service+dao 也不错。
0 请登录后投票
   发表时间:2011-06-22  
我还是感觉这个service改成叫dao比较合适,本来就干了dao的事情嘛
0 请登录后投票
   发表时间:2011-06-22  
好的设计,继承多用于接口上,而不是实现上。
0 请登录后投票
   发表时间:2011-06-22  
层次还是分清楚点吧。在同一层次这种继承关系是正常的

另外BaseServiceImpl 里面那个 private Object obj 干啥的?
0 请登录后投票
   发表时间:2011-06-22  
固定一个模子,专心实现业务逻辑。如何业务逻辑也不用手写了。。java good
0 请登录后投票
   发表时间:2011-06-22  
我有时候也挺纠结的。继承太多,有些累赘。主要看类信息是不是聚合的。如果是扩展关系就是承继。如果是调用关系就代理吧。
0 请登录后投票
   发表时间:2011-06-22  
拥抱变化之美 写道
好的设计,继承多用于接口上,而不是实现上。

完全同意
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics