ooAD大报告之 Petstore中EB的设计模式分析 2.1.4. PetStore的例子 2.1.4.1概述 首先我们看UML图,这是 Petstore UM图,我们用Rose画了出来 <<inte rface> CatalogUe blmpl <<inte rface>> CatalogE日 tected Catalog DAO dao CatalogDAOFactory Catalog DAO CatalogDAOImp 这其中使用了GoF的工场模式,也是简单工场模式,它负责使用那个具体实现类,好像大家都可 以干这活,它来选择到底由谁来做,就是我们的人力资源的 我们在仔细分析下,就是在 CatalogejB类中有一些业务逻辑,如 IgetProduct,它来取某项分 类的产品,这样也许读取数据库,也有可能读取XM文件,于是它就调用 CatalogdAO的方法,来实 现,但是 CatalogEJB并不知道数据到底存在那里,它只管读就行了。可是 CatalogDAO也只是声明 这个方法真正辛苦干事情的就是 CataloguE0Iml,它负责读取数据库。我们不要忘记在 CatalogejB 有个方法,它调用了工场,它来确定又谁来做。 下面是我们使用Rose的逆向工程,获得的M图。 作者:张玉平,吴小静,范赟梦,张麒,罗晟,张翅 6
OOAD 大报告之 PetStore 中 EJB 的设计模式分析 作者: 张 玉 平 , 吴 小 静 , 范 赟 梦 , 张麒,罗晟, 张 翅 6 2.1.4. PetStore 的例子 2.1.4.1 概述 首先我们看UML 图,这是PetStore UML 图,我们用Rose 画了出来。 这其中使用了GoF 的工场模式,也是简单工场模式,它负责使用那个具体实现类,好像大家都可 以干这活,它来选择到底由谁来做,就是我们的人力资源的。 我们在仔细分析一下,就是在CatalogEJB 类中有一些业务逻辑,如getProduct ,它来取某项分 类的产品,这样也讲读取数据库,也有可能读取XML 文件,于是它就调用CatalogDAO 的方法,来实 现,但是CatalogEJB 并丌知道数据到底存在那里,它叧管读就行了。可是CatalogDAO 也叧是声明 这个方法,真正辛苦干事情的就是CatalogDAOImpl ,它负责读取数据库。我们丌要忘记,在CatalogEJB 有个方法,它调用了工场,它来确定又谁来做。 下面是我们使用Rose 的逆向工程,获得的UML 图
o0AD大报告之 Petstore中EB的设计模式分析 CatalogDAOFactory CatalogEJB from dao setsessioncontexto get category CatalogDAO getcategoneso getProductso (from dao getProducto getters( Sgetcategoryo getltemo tcategarieso ○ Catal ogLocalHame (pm e b) T-getDataSourceo Ssearchtemso 2.1.4.2 Catalogejb public class CatalogeJB implements SessionBean protected Catalogdao dao: public void ejbCreateo try //使用工程模式,产生DAO //获得产品信息 public page getProducts( String category ID, int start, int count, Locale 1) 作者:张玉平,吴小静,范赟梦,张麒,罗晟,张翅 7
OOAD 大报告之 PetStore 中 EJB 的设计模式分析 作者: 张 玉 平 , 吴 小 静 , 范 赟 梦 , 张麒,罗晟, 张 翅 7 2.1.4.2 CatalogEJB public class CatalogEJB implements SessionBean { protected CatalogDAO dao; public void ejbCreate() { try { //使用工程模式,产生DAO dao = CatalogDAOFactory.getDAO(); } catch (CatalogDAOSysException se) { } } //获得产品信息public Page getProducts(String categoryID, int start, int count, Locale l) { try {
ooAD大报告之 Petstore中EB的设计模式分析 //调用DAO,实现业务逻辑 return dao getProducts(category ID, start, count, 1) catch(CatalogDAOSys Exception se)( EJBException(se. getMessage o) } 2.1.4.3 CatalogDAo public interface CatalogDAO //声明能力 public Page getProducts(String categoryID, int start, int count, Locale 1) throws CatalogDAOSys Exception: 2.1.4. 4 Catalog DAOimpl DAOpublic class CatalogDAOImpl implements CatalogDAO public Page getProducts (String categoryID, int start, int count c= getDataSourceo. get t connection r ps =c. prepareStatement( select a productid, name, desc product a Jo + product details b on +a productid=b productid) +where locale = Resultset TYPE SCROLL INSENSITIVE ResultSet CONCUR READ ONLY Ing ps setString(2, categoryID /读取数据库 作者:张玉平,吴小静,范赟梦,张麒,罗晟,张翅 8
OOAD 大报告之 PetStore 中 EJB 的设计模式分析 作者: 张 玉 平 , 吴 小 静 , 范 赟 梦 , 张麒,罗晟, 张 翅 8 //调用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(); // 读取数据库
ooAD大报告之 Petstore中EB的设计模式分析 ps close o catch (SQLException se)( 2.1.4.5 Catalog DAOFactory public class CatalogDAOFactory i public static CatalogDAo getDAoO throws CatalogDAOSys Exception I CatalogDao catDao null try i /依据系统配置的信息,产生一个实现类 catDao =(CatalogDAo) Class. forName(className). newInstance o catch(Exception se) return catDao 2.1.5.GOF模式关系 我可以简单解释以下 21.4.6 Bridge模式 结构 作者:张玉平,吴小静,范赟梦,张麒,罗晟,张翅 9
OOAD 大报告之 PetStore 中 EJB 的设计模式分析 作者: 张 玉 平 , 吴 小 静 , 范 赟 梦 , 张麒,罗晟, 张 翅 9 rs.close(); ps.close(); } catch (SQLException se) { } } 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 模式 结构
ooAD大报告之 Petstore l中EB的设计模式分析 Abstraction Implementor Operation( 9 --imp->0 m ConcretelmplementorA ConcretelmplementorB RefinedAbstraction 意图:将抽象部分与它的实现部分分离,使它们都可以独立地变化。适用性 你不希望在抽象和它的实现部分之间有一个固定的绑定关系。例如这种情况可能是因 为,在程序运行时刻实现部分应可以被选择或者切换。 类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这时 Bridge模 式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。 对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译 21.47 Adapter模式 它有两种方式实现。比较简单,就不多说了。 2.2. Value object模式 值对象模式,在SUN的站点上有详细的描述,并且《』2EE核心模式》上也有详细描述,其实这 种模式,我们每天都在使用,目的就是减少网络流量,提高效率,许多书上叫做的粗粒度。和这种 模式相关的还有复合实体,值对象组装器,值列表处理器。 在项目开发中有一个人负责系统的全部 entity Bean,为每个 entity Bean建立值对象,并且建立 他们之间的关系。其他的开发人员只管调用就行了,如果数据库修改,它来修改。这种方式,我建 议大家使用 2.2.1.意图 Efficiently transfer remote, fine-grained data by sending a coarse-grained view of the data 我们知道EB的调用使用了远程方法,它的效率一般要远低于本地方法的调用 作者:张玉平,吴小静,范赞梦,张麒,罗晟,张翅10
OOAD 大报告之 PetStore 中 EJB 的设计模式分析 作者: 张 玉 平 , 吴 小 静 , 范 赟 梦 , 张麒,罗晟, 张 翅 10 意图:将抽象部分不它的实现部分分离,使它们都可以独立地变化。适用性 • 你丌希望在抽象和它的实现部分乊间有一个固定的绑定关系。例如这种情冴可能是因 为,在程序运行时刻实现部分应可以被选择戒者切换。 • 类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这时B r i d g e 模 式使你可以对丌同的抽象接口和实现部分迚行组合,并分别对它们迚行扩充。 • 对一个抽象的实现部分的修改应对客户丌产生影响,即客户的代码丌必重新编译。 2.1.4.7 Adapter 模式 它有两种方式实现。比较简单,就丌多说了。 2.2. Value Object 模式 值对象模式,在SUN 的站点上有详细的描述,并丏《J2EE 核心模式》上也有详细描述,其实这 种模式,我们每天都在使用,目的就是减少网络流量,提高效率,讲多书上叨做的粗粒度。和这种 模式相关的还有复合实体,值对象组装器,值列表处理器。 在项目开发中有一个人负责系统的全部entityBean,为每个entityBean 建立值对象,并丏建立 他们乊间的关系。其他的开发人员叧管调用就行了,如果数据库修改,它来修改。这种方式,我建 议大家使用。 2.2.1. 意图 Efficiently transfer remote, fine-grained data by sending a coarse-grained view of the data. 我们知道EJB 的调用使用了进程方法,它的效率一般要进低于本地方法的调用