《面向方面编程的一种新型设计模式.pdf》由会员分享,可在线阅读,更多相关《面向方面编程的一种新型设计模式.pdf(7页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第1期2()(一8年1月华东师范大学学报(自然科学版)Journ alofEa stChinaNormalUniv e rsity(Natu ralSeie nee)No.1Ja n.2(川8文章编 号:1()(川一5 6 4 1(2(川8)()l一()()6 8一()7面向方面编程的一种新型设计模式徐倩颖,杨宗源(华东师范大学 计 算机科学 技术系,上海州川)62)摘要:通过对一个持久性框架方面进行抽 象化的重构来提高Aspe ct的重用性,并在此基 础上提 出了 面向方面编程领域 的一种新型设计模式:方面桥模式AspectBr idge).该模 式解决了构件 与行为模式 间的祸合问题,体现
2、 了“高层分离,低层祸合”的原则.关键词:面向方面;设计模式;方面桥模式;重构中 图分 类 号:TP3 11文献 标识码:ANoveldesignPatternofa sPe et一orientedProgram mingX UQia n一ying,YANGZo ng一yua n(DoPorz,尸nz,/,mPut尸rs。;e,r.E a、rCh;,uN,r,ulU,;二尸 r、;t夕,Shu刀月h,l;2()()()6 2,Ch:,:a)Abstr a et:Thepape rpr e s e ntedanovelde、lgnparternofa spe et一o r ze ntedpr o
3、gr amming:Aspe etBrldgePatte r nintheproee ssofr efa etorrngape rslsten e efr amewo rk.Thispatre rnsolve stheeouplingprob ler nbetwe entheeor npo nenta ndthebehav一 orpatte r n.a nd15obeytorheprineiple:de eoupleinhighlevel,eoupleinlowlevel.Keywords:a speet一or 一ented;de signpartern;a spe erbridgepatre
4、rn;r efa etoring()引言当前主流的软件开发范型是 面向对象编程(obje eto rientedpr。pram mLng,)OP),然 而在0 0 P开发中存在着“代码分散”和“代码缠结”的 问题,较 为典型的有:日志记 录、权限检查、缓存和持久 化等等,这些 系统级代码散布在系统 的许多模块中,人们将其称为横切关注点(er。S、C ut tinge。n Ce r n).A()P(aspe Ct。rie ntedpropramm ing)的提出就 是为了解决这 一类问题,它 的核心思想是 对软件系统各个互相 独立的横切关系 加以模块化,使之可以有效集中地被管理,而不会让其分散到
5、程序代码 的各个 地方.面 向对象软件领域的设计模式一般被定义为“用来在特定场景 下解决一般设计问 题的收稿日期:2()()7一()4基金项目:2()()6年博士学科点专项基金(2()()6()26)阴2)第一作者:徐倩颖,女,硕士,主 要研究方向为软件工程及 环境,面向方面软件开发.E一mail:5 1()512()川26e .通讯作者:杨宗源.男.教授,主要研究方 向为系统软件,软件工程、工具及环境.E一mail:yzyu a nc s.e en u.edu.。n.第1期徐倩颖,等:面向方面编程的一种新型设计模式类和相互 通信对象的描述”二.其基本思想是:尽量降低对象之 间 的祸合性,避免
6、开发人 员做重复的工作,使得 程序更加简洁,更 加容易理 解.自从E.Gam ma等人提出 了设计模式的概 念,设计模式作为对某个设计问题 的具有可扩展,可重用,可维 护 的公共解决方案,得到了软件技术研究人员的广泛关注与重视.随着3 3研究的深 人,除E.Gamma等人 提 出 的23种基本设计模式之外,研究者还提出 了各种设计模式,例如:F.Bu shma n n等人提出 的设计模式系统概念匡,M.K ir ch e:等提出 了资源管理方面的设计模式工等等.设计模式在广阔 的领域得到了发展和应 用.目前,人们对AOP和设计模式的交叉研究主要致力于使用AOP方法重新实现设计模式,研究者已经将
7、2 3种 设计模式中的1 7种 用AOP方式重 新实现 了一气但是,对于A OP本身的设计模式的研究,目前还缺乏,.面向方面编程是面向对象编程 的 补充和延续,因此面向对象的设计模式不能直接套用到面向方面的软件设计中,面向方 面 的软件设计应该拥有自己的设计模式,从而提高用A OP方法开发 的系统的可扩展,可重用 和可维 护性.本文通过 对一个持久性框架Aspe ct进行重构,说明了如何利用抽象化方面的方法来提高As Pe ct的重 用性,并在此 基础上提出了一种用于 面向方面编程的新型设计模式:方面桥模式.该模式使用Aspe ct构造来封装构件与行为模式之 间 的祸合,不仅从高层设计阶段确保
8、构件模块与行为模式各 自具有清晰的职责,而 且使得模块 更加独立,提高了灵活性 和重 用性.此外,利用AOP的织 人 机制,行为模式、方 面桥代码 和构件代码 可以在编译或运行阶段无缝地交织在一起.该模式体现 了“高层分离,低层根合”的原则,提供给设计者一个模块清晰 的视角进行设计和代码实现,而把复杂的低层藕合工作留给AOP织入器完成.1提 高Aspec t重用性解决方案下 面展 示 的是 一个简单构件类.Pr odu ct是一个产品抽象类,D V D类表示DV D产 品,并继 承了Pr odu ct类.Bo xset类也继 承了Pr odu ct类.并且封装了一 些D V D产 品.它们之
9、间的层次如图1所示一6一ProduCt,r iee二doubleet Pr i喊inpr iee:由uble)DV De ount二i川一set Cou llt(i neount:in t)一get Cou nt o:int一D vD(i nn:stl七19)D】X s ettota iCo un i:in tadd(i nd vd:DVD)r emo ve(ind Vd:DVD)一Bo xs c一 nn a me:st r ing)图1Produet类层次图Fig.1Hie r a r ehydiagr amofpr odu etela s s假设 需要 把D V D类和Box se t类的
10、状态持久到一个数据库中,为了 和第三方的持久框架合作,D VD和Box se t必须实 现一个s to re()方法来处 理将其状态写入数据库的细节.因为数据库存取 要花 费宝贵的时间,所以这两 个类只在其状 态有所 改 变 的时候才要持久保存数据.在AOP出现之前,实现 这 一目的 的 唯一 方 法 是每 当某 个 域 改 变 时 就 手 动 更 新一个d irt y标记.这 种方 法导致Pe r sisten ce代码会 和具体类代码混在 一 起.而且,如 果换一种持华东师范大学学报(自然科学版)2()()8年久策略的话,D VD类和Bo xset类的代码就无 法重用了.1.1一种AOP解
11、决方案可以通 过Aspe ct J的接口功能,实现 这个解决方案,图2使用扩展 了 面向方面概念的UMIJ(unified modelingla nguage)建模方法7二来描述这个解决方案.IntC ff aCePC rsistCn C C)sta teCha nge(persiste ntob jeetPo)ba se=ta r get(Po)&(set(!t ra ns一ent*.*)&!set(bo olea nPer sist entob jeer刁ir t y)a dviee_ido laf te r(pers一st entob je etPo)ba se=stateCha nge
12、(po)po月ir t y=tru e二!书严eT ypeba se一persistentobjeet :interf aeePersistentob je etPe rslstent o b je et-一寸图2一种AO P解决方案的UMI建模图F ig.2UMIr nodelingdiagrar noftheAOPsolutio nA)P 的典型解决方案:首先定义一个持久化对象接口Pe rsisten t()bje ct:publiCinterfa e ePersiste ntobje et/持久化 对象的定义Publlevoidstore():接下来,在a spe etInte rfa
13、e ePe rsiste n e e中,使用 了Aspe etJ的类型间 声 明(introdu e-tion)之吕一,为Pe r sistento bje et接口添加dirty标记 和St。re()方法:privatebo ole a nPe r siste nt()b jeet.dirty=fals e;pub liCv。ldPersiste ntobje et.Stor e()/依据dirty标记决定持久化行为de ela r eparents使用一个类型模式来令D V D和Bo xs et实现Persistent()bje ct接口:de clareparents:(D VD一Box
14、 s et)implementsPe r sistentobie et;这样stateChange切人点和advie e就 可以通过pe r siste ntobie et来引用它们影响的类型了.这种解决方案的优势显而易见:持久化代码 不再凌乱地散布在各个相关类中,而是被封装到了as Pe ct中.As Pe ct J的类型间声明机制使a spe ct能够把必要 的行为添加到它们所影响的类型中,这样有助于a sp ec t构成一致的行为模块,行使 自己的使命.上例中,在P er si s t e ntob jec t接口不知觉的清况下,aspe et向该接口添加成员变量(dirty)和成员函数
15、(Sto r e(),使用这种方法,既存储了一个对象的状态,又不会与对象本身状态发生矛盾.因为接口根本不知道 它参与到 了这个持久保存策略中,因此它可以在没有这个Pe rs is te nc eas Pe ct的情况下重新编译,也可以在其他持久保存策略下重用.兑现 了Sun公司的“一次编写,随处运行”的著名承诺.第1期徐倩颖.等:面向方面编程的一种新型设计模式.As Pe ct J的接口机制使stateCha n g e 切 人点影响 到 了所 有 目标为P er s is te ntob je ct的域集.如果不使用这 个接口机制,那么每一个需要持久 的类(如D V I)和氏x se t)都
16、要集成一个持久框架,并添加一个标记来支持需要进行的存储操作.不仅代码冗余,也不利于软件重用.这种方案达到了AOP思想 的 预期目的,看 起来已经很完美了.但事实上,如 果再 深入下去,会 发现这种方案还存在着问题:在一个真实系统中,不仅每个类都需 要 它自己的Store方法,还要求开发者 自己定 义那些状态变化的po in tcu t.除此以外,这种解决方案还暴露了一个问题:对象数量 的变化未必能准确地 反 映出状态的变化.考虑Box se t中的方法:pub lzevoidad d(DV Ddvd)boxset.add(dvd);pub lievo一dr emo v e(DVDdvd)box
17、 s et.r er nov e(dvd);)这些方 法 很 明显地 改 变了Box se t的状态.然而,因为它们并没有显式地直接设置实例变量 的操作,而是 通过add和r emove函数的调 用来改变状 态,所以它们的使用不会令对象设置d ir ty标记.因此,这 种解决方案虽然可以保证 功能构件(DV D类和Box set类)的 灵 活性和重用性,却不能保证a spec t可以应用于系统中的任何对象.下 面通过 对这 个 方面进行重构,把持久性的解决方案转化为一个可完全重用 的a spe ct.从而使之能应 用于系统中的任何对象.1.2抽象化方面前面的解决方案需 要定制每一个受影响的对象
18、的持久行为.每个持久性类都需 要自己的Sto r e方法,同时每个类都要判断哪个操作是 改 变其状 态 的.针对 这些情况,可以考虑使用抽象的aspe ct来提供可定制的面向as Pe ct行为,下面给出这 种方案的具体实现代码.publieabstra era spe etPersiste n e ePr oto eolPrivatebo ole a nPe r s 一 ste nt()be et.dlrty=false;Pub l一 ef一n alvoid Pe r s lste nt()bjeet.sto r e()If(dirry)、t()re(gerCon n e etion():e
19、ls ed一rry二false;Pub liealstra ervoidPe r、i、te nr()bzeet.st ore(Co n ne et一o ne);ab、traetpo 一nte utstateChang。(Pers一 stent()b3eetpo);after(Pe r s,stent()b je epo)r etu rning:stateCha nge(po)po.d一rry=tru e;Co n n eerio nPe rsistent()b je er.get(o n ne etio n()Co n n e etio neo n n=null;retUTf lCo n f
20、l;pe r sistene eproto eol提供了指 向stor e(Co n n e etion)的连 接,从 而使得该协议可以获取该连接.这样,公 共行 为(获取 连 接,打开连接等等)将保留在 公共 的位置而 不是 出现 在每个持久 的对象中.同样,如果需要的话,获取Conn ect ion()方法 可以由s uba spe ct来替换.这华东师范大学学报(自然科学版)2()()8年样,如果D V D类需要 一个不同于Box set的连接,那么很容易进行改变.此外,Persiste n e eProto e ol声明 了一个抽象的StateC hange切人点,将StateChan
21、ge事件的确切定义委托给抽象化方面的实施者s uba spe ct.这样,抽象化方面就定义 了公共行为,而sub aspe ct则判定这 些行为在什么情况下有效.Persiste neeProto eol为持久性对象定义 了一个接口.通过 这个接口,Pe r sistene eProtoeol与这些对象相互作用.Pe r si s ten ceP ro to co l只有在持久性对象为d irt y时才会保存它,并且在由具体s ubaspe ct定义 的连接点处对这 些持久性对象进行操作.1.3用suba spe et定制持久性策略有了persLstene eprotoeol.就可以通 过Su
22、ba spe et定制应用于特定类的持久性策略了:publiea spe etD V DPe r sisteneee xtendsPe r sistene eProtoeolde ela r epa r ents:D V Dimpleme ntsPe r siste ntob jeet;pointe utstateC hange(Persiste ntobjeetpo):s et(!statie!tra n sie nt*关)邑 邑target(po)邑乙ta rget(D vD);publ cvoid D V D.stor e(Conne etineonn)/特定于D v D类 的持久性操作
23、publiea spe etBo xsetPe r siste n e eextendsPerslste neeProto eolde ela r epa r ents:Boxsetimpleme ntsPer sistentob je et;pointe utstateChange(Pe r sistent()b je etpo):(S et(!Static!tr a nsie nt二*)一addsAnd Remove s()邑己target(po)邑 邑ta rget(B。x s et);pointe utaddsAndRemo v e S():C al l(、add()1C all(*r
24、emo v e();publievoid Box s et.stor e(Co n neet,o neonn)/特定于Bo xs et类的持久性策略两个s ubaspe et分别实现 了Per sistentobje et接口,并且定制了自己的pointcut和Sto r e方法.这样,Persi st en cePr ot oc olaspe ct可以被重用到系统 中任何需要持久化的对象上,而系统中每一个需要持久性策略的对象,都可以通过实现这个接口来满足特定的要求,ASpect的重用 性和模块性得到了提高.2方面桥模 式作为一种有效的方法,很多设计模式都使用封装来创建对象之 间的分界层让设计
25、者可以在分界层 的一侧做修改,而不会对 另一侧产生不良的影响.这促成了层次之间的松藕合.在面向对象的设计模式中,桥接模式(Br ldge户二就是 这样一 种模式,它将抽象部分与它的实现部分分离,使它们都可以独立 地变化.通过 对上面这个例子 的重构与分析,可以发 现,Persistene eProtoeola spe et定义了系统中所有构件的持久化行为模式,它只了解构件在其中所 充当的角色,对于具体的类,它一无所知.只有通过详细定义 的接口,a spe ct才能与这 些类进行交互.直观地想,这 种设计方案与O OP设计模式中的B ri dge模式有异曲同工之处:都是将抽象部分与具体的实现部分
26、分离,降低两者的祸合性,使它们可以独立地变化.但是它与0 0P设计模式中的Bri dge又是不同的,本文稍 后将讨论 它们的不同之处.2.1方面桥模式的视 图第!期徐倩颖,等:面向方面编程 的一种新型设计模式使用抽象化方面 的解决方案提供了方面桥,即“桥式”a spe Ct,而 不是将行为代码混合到受影响的类中.D VDpe r siste neea speet和Box setpersisren e easpe et都可以看作是方面桥,它们具体化了Pe rsiste n e eProtoe ol,并使其符合DV D类与Box s et类的要求.方面桥封装了行为和构件之间的藕合,在这两者之 间充
27、当着适配器 的作用,最后 的结果就产 生 了更加独立的模块.有了这 组aspeet,Per sisten e eProtoe ol就可以应 用于新的 系统 中.同样,D VD类和Boxs et类仍能扮演多重角色.图3是方面桥模式的视图.Ab、t raetio n鹭每应囚a a abstractPo l nteur()o o ope rat一 o n()A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A AsPeetBndge e e
28、C C Chu ngeIndePendentl y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y yC C C C C C Co n er eteAsPeetA A A A ACo n ereteAsPe erB B B B BCo n e reteAsPe ctC C Ce e e e e e e e e e e e e e e e e e
29、e e e e e e e e eo ne retePo lnteut()e o ncr ctcPo一 nteut()eo n e retepo lnte ut()o o oPer at一 o nlr叩()oPer all o nlm P()oPer atl o nlmPf)图3方面桥模式的视 图F19.3Viewof Aspeet一Bridgepatter n2.2方面桥模式的描述下 面借助于OO P设计模式中的基本元素,对方面桥模式作如下描述.川模式名:方面桥模式.(2)意图:将构件的实现从为它们定义的行为模式中分离出来,使之 可以独立地 变化.完全重用.(3)问题:每个构件对于行为模式都
30、有定制的策略,构件与行为模式又不能 紧祸合.(4)解决方案:通 过抽象化方面来表现行为模式,对 应于每一个具体的构件,只需要 用一个Subaspe ct实现定制策略.(5)参与者与协作者:A bstra ction定义 了抽象行为模式,不必知道Compon e nt类.eon-e r eteAspe et作为Abstra etion和eompon ent的通信桥梁,为e ompon ent实现定制行为.(6)效果:行为模式与构件分离,增加了两者的灵活 性和重 用性.(7)适用性:以下一些场景可以考虑使用方面桥模式.每一个构件相 对于行为模式有不同的定制策略,因此不希望在行为模式和构件功能实现部
31、分之间有 一个固定 的绑定关系;对一个构件代码 的修改 对行为模 式不产生影响,即行为模式的代码不必 重新实现,反之亦然;想 对行为模式完全隐藏具体的构件类实现细节,或者想让构件类在“不 知情”的情况下参与到模式定义的某种行为策略中.(8)实现:在高层 设计视 角,定 义一个抽象方面来指定构件共同的行为模式,然 后 为每个具体的构件类定制Suba spe ct,实现特定 的行为策略.而构件类则负责各 自的 功能 逻辑.在低层实现视角,Aspe c t J语言规范支持as Pe ct继承 机制,织人 器 预处理每个 方面的源代码,华东师范大学学报(自然科学版)2()()8年7 4通 过识别抽象方
32、面和继 承方 面 的语言构造,将其与构件代码进行无缝编织,口.2.3方面桥模式与Br idge模式的比较本文提出 的AO P中的方面桥模式与O O P中的Bri dge模式在设计思想上是有所类似的,即都是封装变化点,使桥两端的部分可以独立变化.但是A OP毕竟是()()P 思想的一种补充和延续,因此 这两种模式并不等同,在具体实现上也 是有差异的.Bri dge模式用以解决O OP中“一个抽象类的 派生类必须使用 多种实现部分,但又不能引 起类数量的爆炸”的问题匡,将一组实现部分从 另一组使用它们的对象中分离出来,它的B ri dge体现在“为正在实现 的对象定义的接口(Abstr a eti
33、on)”和“为特定的实现部分类定 义的接口(Impleme ntor)”之间.而本文提出的方面桥模式用以解决A O P中“构件相对于行为模式有各 自不同的定制策略,又不能紧祸合”的问题,它 的“桥式”体现在“抽 象模式”和“构件 行为”之间,通 过S ub-a speet实现这种桥接.有了s uba spe et这 座“桥”,a spe et和e ompo n e nt之间的祸合度可以大大降低,不受对方具体实现 的牵制而独立变化.3结束语AOP是一种新 的编程 思想,与其相关的很多领域的研究工作都还 处于起步 阶段,就设吓模式而言,o 0P中的设计模式并不能完全适 用于AO P,因此A OP需
34、要有 自己的设计模式.本文在对一个持久性框架的重构过 程中,提出 了AOP编程领域中一 种新型设计模式:方 面桥模式,解决了构件与行为模式之间的藕合问题,提高了模块各 自的 独立 性、可 重用 性和可维护性.此外,利用Aspe ctJ丰富的语言构造和方 面织人器 强大的织 人功能,使系统开发者可以只关注于开发职责清晰的模块,而将复杂的模块藕合工作交 由编译器完成,不受低层实现机制所累.随着A OP技术的不断成熟及应 用领域的不断扩大,会有更多的针对AOP的设计模式被提出,以指导A OP程序员 的设计开发.参考文献G AM MAE.H ELMR.J()H N S()NR,etal.DeslgnP
35、atte rn、:Eleme ntSofRe u s able()bje et一()riented Softwa reM.Boston.U S A:A d dlso n一We sley.1(),5.FR A N KB,R EG IN EM.H A N S R.et。1.Patte r n一ortentedSoftwareArehlte erur e一ASystemofPatre r n SM.Hoboke。.U SA:Johnw】leya.So n、.1()9 6MIC H A E IK.PR A S H ANTJ.Parto rn一or lenledsoftwareArehlte eture
36、:Pat te rn、forRe sou r e eMan agement,Vol-ume3M.Hoboke n,U SA:Johnw,ley吕Son S.2(一()4.HA N NEMAN NJ.K l(Z A I ES(夕,De s lgnparte rnlmpleme ntatlon,nja v aa ndaspe etJE B/()I.2()7一(一5一引.hr-tp:/w w w.e s.ube.e a/labs/splpapers/2()叉)2了o opsla 一2一patre rns.pdf.徐宝文周 超洪.周天琳,等.面向方面的程序设计:概念、实现与未来J.计算机与数字工程,2
37、()肠,33(8):1一川.JO SE PHD,N I C H()IA Sx.Ma ste ringAspeetJ:Aspe e卜oriented Pr ogr amm:nginJavaM.NewYork:JohnW一ley,2()()3.曾路.张立臣.扩展uM工用于面向方面的建模J口.微机发展,2()()4.14(12):川6一1 1().Aspe etJProgram mlng(;uideE B/()IJ.2()硬)7一()5一3一口.ht rp:厂/w w w.e el,pse.org/a speetJ/doe/r ele a s ed/pr og guide/index.htm l.AL ANS,JAME S R.DeslgnPattern、Expla tn edM口.Boston,UsA:A d d15o n一we sley.2()()2.R AMNIvA S 1.1wa n士myA)P.Pa川一Pa r,3E B厂()IJ口.仁2了川2一川一】8.ht印:z/ww w.z。v。worl spe er.htm l.|习门!一|日刁le s1气,、J叶叮|l厂L厂e s.56仁7口8,1 一
限制150内