| |
一、引言
不可否认,编代码、写程序,编的写的其实是人的思想;而设计模式更是这种思想的总结。“求同存异”是周总理的著名外交思想之一,“求同”就是寻求相同的地方,并且来解决它;“存异”就是搁置不同的地方,搁置的意思不是不解决,而是留待后面去解决。
在设计模式中,模板方法正是体现了这种思想的典范。
模板方法,定义一个操作中算法的骨架,将一些步骤的执行延迟到其子类中。其中,这些在父类中实现了的步骤就是所谓的“同”,“求同”就是在父类中把相同的功能先实现;而那些延迟到子类中的步骤就是所谓的“异”,“存异”就是把不同在父类中遗留下来,到子类中去各个实现。
在实际的工作中,经常会遇到这样的情况:有一序列的功能相同的模块,这些模板有很多相同或相似的步骤;当然,也有一个或两个不同的步骤。
如,有在线购物功能的网站,经常要对商品进行各种各样的排名:按商品的点击率排名、按商品的购买率排名、按商品的入站时间排名、按商品的类别进行的搜索等等。这些都是一些搜索功能,功能完全相同;不同的要么是搜索的算法、要么是搜索的数据表不同。
我们知道,如果采用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
|
|