服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

求同存异――java模式系列谈之模板方法


一、引言



  不可否认,编代码、写程序,编的写的其实是人的思想;而设计模式更是这种思想的总结。“求同存异”是周总理的著名外交思想之一,“求同”就是寻求相同的地方,并且来解决它;“存异”就是搁置不同的地方,搁置的意思不是不解决,而是留待后面去解决。

在设计模式中,模板方法正是体现了这种思想的典范。

模板方法,定义一个操作中算法的骨架,将一些步骤的执行延迟到其子类中。其中,这些在父类中实现了的步骤就是所谓的“同”,“求同”就是在父类中把相同的功能先实现;而那些延迟到子类中的步骤就是所谓的“异”,“存异”就是把不同在父类中遗留下来,到子类中去各个实现。

在实际的工作中,经常会遇到这样的情况:有一序列的功能相同的模块,这些模板有很多相同或相似的步骤;当然,也有一个或两个不同的步骤。

如,有在线购物功能的网站,经常要对商品进行各种各样的排名:按商品的点击率排名、按商品的购买率排名、按商品的入站时间排名、按商品的类别进行的搜索等等。这些都是一些搜索功能,功能完全相同;不同的要么是搜索的算法、要么是搜索的数据表不同。

我们知道,如果采用struts模式的开发方法,那么我们所有的这些功能的实现都是在一个继承了action类的public actionforward execute ( actionmapping actionmapping, actionform actionform, httpservletrequest request, httpservletresponse response)中实现,这里需要实现的功能有:取得进行搜索所需要的各种条件,进行搜索算法、处理搜索结果。在这里,取得搜索所需的条件和处理搜索结果的算法是一样的,他们将产生相同的代码。不同的只是进行搜索的算法。很明显,相同的代码是需要我们进行重用的。

那么我们该怎么重用呢?



二、从一段代码谈起



首先需要说明的是:这段代码是一段反面的代码,或者说是一段坏的代码。每个人看了都会觉得不可思议,但这确确实实是我们工作中遇到的代码:



public class tospeaction extends action {

   public arraylist       sizerangelabel  = null;

   public actionforward execute ( actionmapping actionmapping, actionform actionform, httpservletrequest request, httpservletresponse response) {

……

          if ("save".equalsignorecase (action)) {

                 stringbuffer productidstr = new stringbuffer ( );

                 stringbuffer specistr = new stringbuffer ( );

                 specimanager.getinstance ( ).saveheaddata (actionform, request, productidstr, specistr, "specification");

                 specid = specistr.tostring ( );

                 productid = productidstr.tostring ( );

                 form.set ("productid", productid);

                 form.set ("specid", specid);

          }

……

          //grid

          if (tab.equals ("0")) { //spec

                 griddatasummary gdsmy = new griddatasummary (specid);

                 gdsmy.specbasedata.settransform (transform);

                 gdsmy.specbasedata.setprevtransform (prevtransform);

                 gdsmy.specbasedata.settextrangesizesrc ((string) form.get ("sizerangeidesc"));

                 gdsmy.specbasedata.setsortpomstr (sortpomstr);

                 gdsmy.specbasedata.setgraderuleid ((string) form.get ("ddlgulevule"));

                 gdsmy.specbasedata.setsizechangeflag ((string) form.get ("sizechangeflag"));

                 gdsmy.specbasedata.sethidepomcode ("hide".equalsignorecase (hidepomcode) ? true : false);

 







                 if ("".equalsignorecase (action)) {

                        load (request, gdsmy);

                 } else if ("load".equalsignorecase (action)) {

                        //grid data

                        load (request, gdsmy);

                 } else if ("save".equalsignorecase (action)) {

                        //save measure table data

                        save (request, gdsmy, form);

                       

                        load (request, gdsmy);

                 } else if ("refgrid".equalsignorecase (action)) {

                       

                        string xmldata = refgrid (specxmlstr, gridmodel, gdsmy);

                        loggeragent.debug ("grid business done     ....../nthe xml data is " + xmldata);

                        request.setattribute ("xmlstring", xmldata);

 







                        //          判定弹出用户自定义排序窗体,并作业务上的处理

                        if (griddataconstant.str_tru

扫描关注微信公众号