PetStore中EJB的设计模式 break; case XML 通过JDOM进行,分析XML文件 这样,业务逻辑中到处是数据的读取,并且修改程序,很麻烦。于是这些牛人,想出 个使用接口DAO(就是 DataAccessObject),它什么具体的事都不做,就申明几个方法,在 业务逻辑类中,只管调用它就行了,好像在说我能做什么,不要管我怎样做,就想我们的销 售接项目一样,说我们公司什么事都可以做。但是项目接下以后,就由我们这些命苦的开发 人员来实现。最后也就是 DAOImplementor根据数据的不同有不同的具体类来读取(它有可 能是 DAOImplementor ORACLE类实现读取 Oracle数据库, DAOImplementor EXCEL, 实现通过API读取Excl文件, DAOImplementor XML实现读取XML文件)。这样你可, 在业务逻辑类中,不负责数据的读取,只关注业务逻辑的实现,它只需调用DAO获得数据, 真正实现数据的读取是 DAOImplementor ORACLE这样的类。 我解释的不知你是否明白,反正我是知道了。多看几次就明白了,其实很简单。 21.4. Petstore的例子 214.1概述 首先我们看UML图,这是 PetStore自带UML图,我用Rose画还需要时间,他们使用 一种叫 ARGOUML的工具,你可以下载,是免费的感觉远不如Rose
PetStore 中 EJB 的设计模式 6/6 break; case XML 通过 JDOM 进行,分析 XML 文件; break; } 这样,业务逻辑中到处是数据的读取,并且修改程序,很麻烦。于是这些牛人,想出一 个使用接口 DAO(就是 DataAccessObject),它什么具体的事都不做,就申明几个方法,在 业务逻辑类中,只管调用它就行了,好像在说我能做什么,不要管我怎样做,就想我们的销 售接项目一样,说我们公司什么事都可以做。但是项目接下以后,就由我们这些命苦的开发 人员来实现。最后也就是 DAOImplementor 根据数据的不同有不同的具体类来读取(它有可 能是 DAOImplementor_ORACLE 类实现读取 Oracle 数据库,DAOImplementor_EXCEL, 实现通过 API 读取 Excel 文件,DAOImplementor_XML 实现读取 XML 文件)。这样你可, 在业务逻辑类中,不负责数据的读取,只关注业务逻辑的实现,它只需调用 DAO 获得数据, 真正实现数据的读取是 DAOImplementor_ORACLE 这样的类。 我解释的不知你是否明白,反正我是知道了。多看几次就明白了,其实很简单。 2.1.4. PetStore 的例子 2.1.4.1 概述 首先我们看 UML 图,这是 PetStore 自带 UML 图,我用 Rose 画还需要时间,他们使用 了一种叫 ARGOUML 的工具,你可以下载,是免费的感觉远不如 Rose
PetStore中EJB的设计模式 nte rface>> Catalo CAtalog DAOFactory Catalog Dao Catalog Dao 这其中使用了GoF的工场模式,也是简单工场模式,它负责使用那个具体实现类,好像 大家都可以干这活,它来选择到底由谁来做,就是我们的人力资源的。 我们在仔细分析一下,就是在 CatalogEJE类中有一些业务逻辑,如 getProduct,它来取 某项分类的产品,这样也许读取数据库,也有可能读取XML文件,于是它就调用 CatalogDAo 的方法,来实现,但是 CatalogEJB并不知道数据到底存在那里,它只管读就行了。可是 CatalogDAO也只是声明这个方法,真正辛苦干事情的就是 Catalog DAOlmpl,它负责读取数 据库。我们不要忘记,在 CatalogEJB有个方法,它调用了工场,它来确定又谁来做。 唉,下面是我使用Rose的逆向工程,获得的UML图。 7门
PetStore 中 EJB 的设计模式 7/7 这其中使用了 GoF 的工场模式,也是简单工场模式,它负责使用那个具体实现类,好像 大家都可以干这活,它来选择到底由谁来做,就是我们的人力资源的。 我们在仔细分析一下,就是在 CatalogEJB 类中有一些业务逻辑,如 getProduct,它来取 某项分类的产品,这样也许读取数据库,也有可能读取 XML 文件,于是它就调用 CatalogDAO 的方法,来实现,但是 CatalogEJB 并不知道数据到底存在那里,它只管读就行了。可是 CatalogDAO 也只是声明这个方法,真正辛苦干事情的就是 CatalogDAOImpl,它负责读取数 据库。我们不要忘记,在 CatalogEJB 有个方法,它调用了工场,它来确定又谁来做。 唉,下面是我使用 Rose 的逆向工程,获得的 UML 图
PetStore中EJB的设计模式 <<EJBSession>> OFac SgetDAO setSessionContexto ejbPassivateO destroyO getProductso getProducto searchitemso Catalog gLocalHome (fom ejb CatalogDAOImpl etcategones agetProductsO 2.1.4.2 CatalogEJE public class CatalogEJB implements Session Bean i ∥那个光说话,不做是的家伙,真正做事 CatalogDAOlmpl类, CatalogejB不知道, 其实现实生活中就有这种事情 protected CatalogdAo dao public void ejbCreateO i try i ∥使用工程模式,产生DAO dao= Catalog DAOFactory. getDAO0 g catch( Catalog DAOSys Exception se)i
PetStore 中 EJB 的设计模式 8/8 CatalogDAOFactory getDAO() (from dao) CatalogDAOImpl getDataSource() getCategory() getCategories() getProduct() getProducts() getItem() getItems() searchItems() (from dao ) CatalogEJB ejbCreate() setSessionContext() ejbRemove() ejbActivate() ejbPassivate() destroy() getCategory() getCategories() getProducts() getProduct() getItems() getItem() searchItems() <<EJBSession>> CatalogDAO getCategory() getCategories() getProduct() getProducts() getItem() getItems() searchItems() (from dao) CatalogLocalHome create() (fro m ej b) 2.1.4.2 CatalogEJB public class CatalogEJB implements SessionBean { //那个光说话,不做是的家伙,真正做事 CatalogDAOImpl 类,CatalogEJB 不知道, 其实现实生活中就有这种事情 protected CatalogDAO dao; public void ejbCreate() { try { //使用工程模式,产生 DAO dao = CatalogDAOFactory.getDAO(); } catch (CatalogDAOSysException se) { } }
PetStore中EJB的设计模式 ∥获得产品信息 public Page getProducts(String categorylD, int start, int count, Locale D)i ∥调周用DAO,实现业务逻辑 return dao. get Products(categorylD, start, count, I) catchCatalog Exception se)( throw new EJBException(se. getMessageo) 2.1.4.3 CatalogDAO public interface CatalogDAO ∥声明能力 public Page getProducts( String categorylD, int start, int count, Locale D) throws CatalogDAOSys Exception 2.1.4.4 Catalog DAOImpl DAOpublic class Catalog DAOlmpl implements CatalogDAO public Page get Products( String categoryID, int start, int count, Locale D)i { c=getDataSource(). getConnectiono ps=c prepare Statement("select a productid, name, descn oduct details b +"and a catid = +"order by name ResultSet TYPE SCROLL INSENSITIVE, ResultSet CONCUR READ ONLY ps setString(l, 1. toString(); ps setString(2, category); rs=ps execute QueryO ∥读取数据库 catch(SQLException se)
PetStore 中 EJB 的设计模式 9/9 //获得产品信息 public Page getProducts(String categoryID, int start, int count, Locale l) { try { //调用 DAO,实现业务逻辑 return dao.getProducts(categoryID, start, count, l); } catch (CatalogDAOSysException se) { throw new EJBException(se.getMessage()); } } 2.1.4.3 CatalogDAO public interface CatalogDAO { //声明能力 public Page getProducts(String categoryID, int start, int count, Locale l) throws CatalogDAOSysException; } 2.1.4.4 CatalogDAOImpl DAOpublic class CatalogDAOImpl implements CatalogDAO { public Page getProducts(String categoryID, int start, int count, Locale l){ try { c = getDataSource().getConnection(); ps = c.prepareStatement("select a.productid, name, descn " + "from (product a join " + "product_details b on " + "a.productid=b.productid) " + "where locale = ? " + "and a.catid = ? " + "order by name", ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); ps.setString(1, l.toString()); ps.setString(2, categoryID); rs = ps.executeQuery(); //读取数据库 rs.close(); ps.close(); } catch (SQLException se) {
PetStore中EJB的设计模式 2.1.4.5 Catalog DAOFactory public class Catalog DAOFactory i public static Catalog DAO getDAOO throws Catalog DAOSys Exception i CatalogDAo catDao= null 依据系统配置的信息,产生一个实现类 catDao=( Catalog DAO)Class. for Name(class Name). newInstanceo i catch(Naming Exception ne)i return cat Dao 21.5.GOF模式关系 我可以简单解释以下。 2146 Bridge模式 结构 Abstraction Operation( P Operationlmp( Refined Abstraction ConcretelmplementorA ConcretelmplementorB Operationlmpo) Operationl( 意图:将抽象部分与它的实现部分分离,使它们都可以独立地变化。 适用性 10/10
PetStore 中 EJB 的设计模式 10/10 } } 2.1.4.5 CatalogDAOFactory public class CatalogDAOFactory { public static CatalogDAO getDAO() throws CatalogDAOSysException { CatalogDAO catDao = null; try { //依据系统配置的信息,产生一个实现类 catDao = (CatalogDAO) Class.forName(className).newInstance(); } catch (NamingException ne) { } catch (Exception se) { } return catDao; } } 2.1.5. GOF 模式关系 我可以简单解释以下。 2.1.4.6 Bridge 模式 结构 意图:将抽象部分与它的实现部分分离,使它们都可以独立地变化。 适用性