设计模式是套被反复使用、多数人知晓、经过分类编目、代码设计经验整理总结使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性 毫无疑问设计模式于己于他人于系统都是多赢设计模式使代码编制真正工程化设计模式是软件Software工程基石如同大厦块块砖石样
GoF“设计模式”是第次将设计模式提升到理论高度并将的规范标准化本书提出了23种基本设计模式自此在可复用面向对象软件Software发展过程中新大量设计模式不断出现
设计模式和框架
现在可复用面向对象软件Software系统现在般划分为 3大类:应用 工具箱和框架(Framework),我们平时开发具体软件Software都是应用;JavaAPI属于工具箱;而框架是构成类特定软件Software可复用设计组相互协作类EJB(Enterprise JavaBeans)是Java应用于企业计算框架.
框架通常定义了应用体系整体结构 类和对象关系等等设计参数以便于具体应用实现者能集中精力于应用本身特定细节框架主要记录软件Software应用中共同设计决策框架强调设计复用因此框架设计中必然要使用设计模式.
另外设计模式有助于对框架结构理解成熟框架通常使用了多种设计模式,如果你熟悉这些设计模式毫无疑问你将迅速掌握框架结构我们般开发者如果突然接触EJB J2EE等框架会觉得特别难学难掌握那么转而先掌握设计模式无疑是给了你剖析EJB或J2EE系统把利器
EJB中设计模式
下面我们从设计模式角度看看EJB框架是怎样?在这的前假设你已经大概了解了设计模式专门设计模式阐述请见我设计模式的系列.
EJB是采取多层结构原先我们数据库开发基本是应用(商业逻辑运算)直接数据库驱动在EJB中为将商业逻辑计算和数据库截然分开使用多个结构式模式:Adapter模式和Bridge模式等.这样做好处显然有 3个:
1.分离了商业逻辑层和数据访问层;
2.能同时支持多个数据库;
3.但数据库类型更换时不会设计到商业逻辑代码大量修改.
EJB中将对数据库进行(如发出select等语句)称为会话bean(Sessionbean),而将对应数据库个个记录bean称为实体bean(Entity bean);由这两种类型bean完成对数据库访问.
会话bean般和客户端应用是对应而和数据库端联系紧密是实体bean,EJB在实体bean(或直接在会话bean)和数据库的间使用了Adapter模式和Bridge模式无意在实体bean和数据库的间又多了层称的为DAO(Data Access Object )DAO实际就是设计模式混合体.
我们以Java宠物店中Catalog为例,这是专门处理宠物店中宠物类别,在对数据库访问中有两个主要:CatalogEJB和CatalogDAO,我们从具体代码中看看设计模式是如何应用.
Bridge模式和Adapter模式
我们首先看看CatalogEJB代码:
public CatalogEJB implements SessionBean {
protected CatalogDAO dao;
//从DAO工厂中获取个DAO 这是工厂(factory)模式个例子
public void ejbCreate {
try {
dao = CatalogDAOFactory.getDAO;
}
catch (CatalogDAOSysException se) {
Debug.prln("Exception getting dao " + se);
throw EJBException(se.getMessage);
}
}
....
}
我们发现在CatalogEJB中并没有通常会话bean那样有对数据库操作"select .. from ."等的类SQL操作语句这些都被封装到DAO具体实现中(Concrete ).在Catalog这个举例中使用了设计模式Bridge模式,判断是否是某种模式主要依据其参和者种类和相互关系我们先看看Bridge模式定义和参和者:
Bridge模式是将抽象和行为划分开来,各自独立,但能动态结合起来(好象搭建了座桥)在本例中是将商业逻辑和数据库访问这样行为划分开来数据库访问专门放置在DAO中了 Bridge模式需要两个接口(抽象类和接口通称为接口)个用来封装抽象部分本例中是封装商业逻辑是CatalogEJB;还有个是封装行为(Implementor)本例中是CatalogDAO,看看CatalogDAO代码:
public erface CatalogDAO {
public Category getCategory(String categoryID, Locale l)
throws CatalogDAOSysException;
public Page getCategories( start, count, Locale l)
throws CatalogDAOSysException;
public Product getProduct(String productID, Locale l)
throws CatalogDAOSysException;
public Page getProducts(String categoryID, start, count, Locale l)
throws CatalogDAOSysException;
public Item getItem(String itemID, Locale l)
throws CatalogDAOSysException;
public Page getItems(String productID, start, size, Locale l)
throws CatalogDAOSysException;
public Page searchItems(String query, start, size, Locale l)
throws CatalogDAOSysException;
}
Bridge模式中参和者还需要有行为接口具体实现(ConcreteImplementor),在本例中是CatalogDAOImpl,虽然在目前宠物店中只有个ConcreteImplementor,但是可扩展为到Mysql XML等数据源访问,比如你可以自己新增个叫CatalogDAOImplMysql也是作为CatalogDAO子类看看CatalogDAO个子类CatalogDAOImpl代码:
public CatalogDAOImpl implements CatalogDAO {
protected DataSource getDataSource
throws CatalogDAOSysException {
try {
InitialContext ic = InitialContext;
(DataSource) ic.lookup(JNDINames.CATALOG_DATASOURCE);
}
catch (NamingException ne) {
throw CatalogDAOSysException("NamingException while looking "
+ "up DB context : "
+ ne.getMessage);
}
}
//具体Select语句在这里出现这里主要是Oracle 数据库访问语句
public Category getCategory(String categoryID, Locale l)
throws CatalogDAOSysException {
Connection c = null;
PreparedStatement ps = null;
ResultSet rs = null;
Category ret = null;
try {
c = getDataSource.getConnection;
ps = c.prepareStatement("select a.catid, name, descn "
+ "from (category a join "
+ "category_details b _disibledevent= home.create;
} catch (javax.ejb.CreateException cx) {
...
}
}
cart;
}
....
}
Facade模式参和者:SessionFacade (ShoppingClientFacadeLocalEJB)
提供组操作流程
将真正工作委托到EJBbean.
EJBbean (CustomerEJB, ShoppingCartEJB等等)
执行基本商业逻辑操作
没有任何对SessionFacade.
这样不但可扩展性大大增强效率也提高了用户端只需要次Remote对SessionFacade就可以了而SessionFacade会自动定位到和它同台服务器那些邻居bean(CustomerEJB, ShoppingCartEJB等等),无疑减少网络拥挤提高了速度.
整理总结
在EJB具体使用中使用合适设计模式不但使代码可重用性 可拓展性增强最重要是能提高效率和速度我们知道EJB框架由于考虑大型系统中事务安全等各方面问题效率性能有所欠缺那么我们在具体问题具体应用时使用设计模式可以弥补这个问题
例如Proxy模式可以为我们在访问巨大需要花费定时间才能展开对象时提供个代理这样不会那个巨大对象而影响当前运行速度EJB中那些bean很显然属于巨大对象(它们有反复数据库操作这些很费时间〕
Flyweight模式是避免大量拥有相同内容小类开销(如耗费内存),使大家共享个类(元类).当你要从EJB中获取系列串,而这些串中肯定有许多是重复,那么我们可以将这些重复串储存在Flyweight池(pool)中以达到共享
在以后篇幅中会陆续介绍此类应用
最新评论