您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 面向对象分析与设计Part 12
CH37使用模式设计持久化框架持久化问题大多数应用都需要永久的存储机制的支持实现持久存储的手段很多:ODBRDB普通平面文件XML文件…CH34使用模式设计持久化框架持久化服务框架持久化服务针对RDB的存储和检索的一组功能的聚合(SQL查询、INSEFRT、DELETE、UPDATE、CREATE、ALTER、EXEC…)O-R映射服务对象和记录之间的转换和映射关系包括对象关系数据库(XML或者其他文件)关系数据库(XML或者其他文件)对象构造方法采购专业的持久化框架,并在此基础上进行设计底层的持久化框架JDOADO数据访问构造块框架Framework的例子:Windows应用程序框架JavaAWT.NetFramework…框架是在较大范围内具有普适性的应用程序基础架构高度的可重用性功能的聚合抽象界面的定义(方法、属性)通过继承和实现框架实现应用程序的功能框架的一般构造模式内聚的类和接口功能内聚稳定的服务接口接口和抽象类定义框架的客户化接口可扩展考虑通过继承实现客户化和扩展消息处理机制提供响应消息的抽象方法供上层应用程序响应持久化框架的作用在持久化存储中检索和存储对象事务的管理构建思想映射对象标识数据库映射器物化和反物化缓存对象事务状态事务操作延迟物化虚拟代理ApplicationCoordinationDomainObject-RelationalPersistenceFrameworkWindowOKCancelName:RelationalDatabasetranslatesobjectstorecords,andviceversaSALESs1:Sale对象和RDB的映射关系对象和关系数据库之间的映射关系每一个需要持久化的对象在RDB中定义一个表对象的原始数据映射成为表中的列对象的引用属性表示为RDB的关系对象的标识为每一个记录的对象分配一个对象标识(OID)OID可以是字符或数字,它是唯一的OID对应着RDB表中的主键反之,也可以将RDB的主键理解为OID数据模型OIDquantitySALESLINEITEMSsli11sli22SLI-OIDSALESLINEITEMS-TO-PRODUCTSPECPS-OIDOIDdescriptionpricePRODUCTSPECp1tofu1.50upc111p2tempeh2.25222sli1p1sli2p2«Table»ProductSpecification«PK»OID:char(16)Description:varchar(100)...«FK»Manu_OID:char(16)«Table»Manufacturer«PK»OID:char(16)Name:varchar(100)City:varchar(50)*1aggregatesignifiesareferentialconstraint:aProductSpecificationrowcan'texistwithoutarelatedManufacturerrowPK-primarykeyFK-foreignkey•RDB的数据模型中要为每一个对象设计一个关键字(ID)•从RDB设计角度出发,实际的数据模型往往与对象模型中的对象是不一致的持久化服务的外观和数据库映射使用外观模式访问持久化服务底层RDB持久化框架(JDO/ADO)提供的功能:SelectInsertDeleteUpdateExecuteConnectTransaction客户化的框架(构造块)将对象和表之间建立映射关系(O-RMaping)提供对象化的外观持久化服务的外观和数据库映射映射对象直接映射对象直接定义将自己保存(提取)到数据库的方法对象中定义了大量与领域无关,而与特定的数据库相关的内容。间接映射使用其他的对象,负责持久化对象的映射处理。数据库映射器每个持久化对象都定义自己的映射器不同的存储机制可以定义不同的映射器基于元数据的映射采用多层映射机制在高层实现与存储机制的无关底层实现存储机制的区别映射器eachmappergetsandputsobjectsinitsownuniqueway,dependingonthekindofdatastoreandformat1PersistenceFacadegetInstance():PersistenceFacadeget(OID,Class):Objectput(OID,Object)...ProductSpecificationRDBMapper...get(OID):Objectput(OID,Object)...ProductSpecificationFlatFileMapper...get(OID):Objectput(OID,Object)...ManufacturerRDBMapper...get(OID):Objectput(OID,Object)...notethattheClassasaparameterisnolongerneededinthisversionofget,astheclassishardwiredforaparticularpersistenttype1«interface»IMapperget(OID):Objectput(OID,Object)...ClassUMLnotation:Thisisaqualifiedassocation.Itmeans:1.Thereisa1-MassociationfromPersistenceFacadetoIMapperobjects.2.WithakeyoftypeClass,anIMapperisfound(e.g.,viaaHashMaplookup)框架的设计模版方法在超类中设计和实现算法的骨架(模版),在子类中覆盖其可变的部分;例子:GUIComponentupdate()repaint()MyExcellentButtonrepaint()//thisisthetemplatemethod//itsalgorithmistheunvaryingpartpublicvoidupdate(){clearBackground();//thisisthehookmethod//itisthevaryingpartrepaint();}hookmethod-varyingpart-overrideninsubclass-maybeabstract,orhaveadefaultimplementationhookmethodoverriden-fillsinthevaryingpartofthealgorithmHOLLYWOODPRINCIPLE:Don'tcallus,we'llcallyouNotethattheMyExcellentButton--repaintmethodiscalledfromtheinheritedsuperclassupdatemethod.Thisistypicalinpluggingintoaframeworkclass.FRAMEWORKclassOURclasstemplatemethodhookmethod框架的设计使用模版方法实现物化映射器中带有缓存的对象获取,存在共性:if(objectincache)Returnitelsecreatetheobjectfromitsrepresentationstoragesaveobjecttocachereturnit不同的是获取的对象设计模版方法AbstractPersistenceMapper+get(OID):Object{leaf}#getObjectFromStorage(OID):Object{abstract}...«interface»IMapperget(OID):Objectput(OID,Object)...{//templatemethodpublicfinalObjectget(OIDoid){obj:=cachedObjects.get(oid);if(obj==null){//hookmethodobj=getObjectFromStorage(oid);cachedObjects.put(oid,obj);}returnobj;}}UMLnotation:{leaf}isusedforfinalorleafoperationsandclasses.#meansprotected;onlyvisibletosubclassesHOOKTEMPLATEProductSpecificationRDBMapper#getObjectFromStorage(OID):Object{//hookmethodoverrideprotectedObjectgetObjectFromStorage(OIDoid){Stringkey=oid.toString();dbRec=SQLexecutionresultof:Select*fromPROD_SPECwherekey=+keyProductSpecificationps=newProductSpecification();ps.setOID(oid);ps.setPrice(dbRec.getColumn(PRICE));ps.setItemID(dbRec.getColumn(ITEM_ID));ps.setDescrip(dbRec.getColumn(DESC));returnps;}}AbstractRDBMappertableName:String+«constructor»AbstractRDBMapper(tableName)#getObjectFromStorage(OID):Object{leaf}#getObjectFromRecord(OID,DBRecord):Object{abstract}-getDBRecord(OID):DBRecordAbstractPersistenceMapper+get(OID):Object{leaf}#getObjectFromStorage(OID):Object{abstract}...{protectedfinalObjectgetObjectFromStorage(OIDoid){dbRec=getDBRecord(oid);//hookmethodreturngetObjectFromRecord(oid,dbRec);}}IMapperProductSpecificationRDBMapper+«constructor»ProductSpecificationRDBMapper(tabName)#getObjectFromRecord(OID,DBRecord):Object{//hookmethodoverrideprotectedObjectgetObjectFromRecord(OIDoid,DBRecorddbRec){ProductSpecificationps=newProductSpecification();ps.setOID(oid);ps.setPrice(dbRec.getColumn(PRICE));ps.setItemID(dbRec.getColumn(ITEM_ID));ps.setDescrip(dbRec.getColumn(DESC));returnps;}}{privateDBRecordgetDBRecordOIDoid){Stringkey=oid.toString();dbRec=SQLexecutionresultof:Select*from+tableName+wherekey=+keyreturndbRec;}}进一步精化
本文标题:面向对象分析与设计Part 12
链接地址:https://www.777doc.com/doc-3968265 .html