声明:这篇文章的设计思想来源于IBM中国技术网站的EJB最佳实践栏目,我仅在它的基础上进行优化设计!请指教!
1, 设计一个业务接口,代码如下:
public interface Business{
}//它什么都不做
2, 本例中我们假设对Book进行业务设计,按面象接口编程思想,我们应该从业务方法中抽取接口来,示例代码如下:
pubic interface BookInterface extends Business{
public Long createBook()throws BookException;
public List findAll()throws BookException;
public List findSellTop10()throws BookException;
}
3, 顺手推“船”,我们现在来实现这个业务接口,示例代码如下:
public class BookImpl implements BookInterface{
private DaoFactory daoFactory;
private BookDao bookDao;
public BookImpl(){
//初始化DAO工厂
}
public Long createBook(Book book)throws BookException{
//初始化bookDao
return dao.create(book);
//释放bookDao资源
//异常处理
}
public List findAll()throws BookException{
…
}
public List findSellTop10()throws BookException{
…
}
}
4.从上面的代码看,利用DAO模式和工厂模式,我们的业务层已经很好的和持久层保持良好的耦合度了,那么在业务层和表示层之间的耦合度呢?我们利用业务委派模式来设计:
public interface Delegate{
}//业务委派接口
public class BookDelegate implements Delegate{
private static final String MY_NAME=”Book”;
private BusinessFactory businessFactory;// 单例模式
private BookInterface interface;//这是接口
public BookDelegate(){
init();
}
public Long createBook(Book book){
return interface.createBook(book);
}
public List findAll(){
return interface.findAll();
}
public List findSellTop10(){
return interface.findSellTop10();
}
private void init(){
businessFactory=BusinessFactory.getInstance();
interface=(BookInterface)businessFactory.createBusiness(MY_NAME);
}
private void destroy(){
}
}
现在,我们来揭开BusinessFactory的面纱了,BusinessFactory需要一个配置文件,business.properties,这个文件示例如下:
##Business.properties
Book=net.huisky.test.business.BookImpl;
Bean=net.huisky.test.business.BeanImpl
##等等
##Over
public class BusinessFactory{//单例模式
private BusinessFactory myself;
private Properties props;
private BusinessFactory(){
init();
}
private void init(){
读取business.properties,初始化props;
}
public Business createBusiness(String name){
return (Business)Class.forName(props.getProperty(mame));
//处理异常
}
}
结果:在Servlet中,我们只要
BookDelegate delegate=new BookDelegate();
就可以调用业务方法了,而且delegate里面使用的是接口,不是实现类
假如你要重写业务方法,你大可不必更改Servlet中代码的调用
只要重写一个BeanImpl即可!
另:业务委派类可以写得更加灵活,那就是利用动态委派,它是利用JAVA的反射机制来实现,有兴趣可前往:
http://www-900.ibm.com/developerWorks/cn/java/j-ejb1119/index.shtml