回调使重构更加简单
前一段时间在重构公司产品中的一个功能模块,这个模块的大致功能就是对文件或文件夹的一些操作(例如删除,复制,粘贴等等),在这些功能操作之前要进行权限判断,然后在操作的同时还要进行订阅、日志处理、与该操作的一些附加操作等等。
这篇文章主要是将回调,所以我会着重讲回调,对于其他重构的一些细节我就略过不说了。首先看一段重构前的代码。
public class CopyOfOperateAction extends BaseAction { private void delete() throws Exception { //现在已经改变为,单选和多选统一操作了 int size = id.length; for( int i = 0; i < size; i++ ){ if(StringUtils.isNotBlank(id[i])){ //进行文件与文件夹对象的区别 BaseObj obj=getFileOrDir(id[i],isfile[i]); new ShareUserOperateAuthority(new BaseObjOperateAuthority(new BaseOperateAuthority()),this.getHttpServletRequest().getRemoteAddr()).authority(obj, getCurUser(), FileConstants.action_delete); if(obj instanceof File){//文件的删除File file = (File)obj;Directory oldDir = file.getDirectory();advice(file,oldDir);fileManager.removeFile(file, this.getCurUser()); setFileAction(FileConstants.action_delete, true, file, oldDir, null); }else{//文件夹的删除Directory directory = (Directory)obj;//定义文件夹所属原文件夹Directory oldDir = directory.getDirectory();callBackAnswer(directory);advice(directory,oldDir);fileManager.removeDire(directory, getCurUser());setFileAction(FileConstants.action_delete, true, directory, oldDir, null); }} } }}public class BaseAction extends ActionSupport implements ServletRequestAware,ServletResponseAware, RequestAware, CookiesAware, ParameterAware,SessionAware, ApplicationAware { public void setFileAction(String action, boolean success,BaseObj actionObj, Directory sourceFather, Directory target) {List<BaseObj> actionObjs = new ArrayList();actionObjs.add(actionObj);setFileAction(action, success, actionObjs, sourceFather, target);}}public abstract class AbstractOperateManager implements OperateActionManager { @Override public void operate(OperateLogManager operateLogManager) throws Exception { for(int i=0;i<operate.getSize();i++){ if(StringUtils.isNotBlank(operate.getId()[i])){ BaseObj obj=getFileOrDir(operate.getId()[i],operate.getIsfile()[i]); operateAuthority(obj,operate.getUser()); if(obj instanceof File){ File f = (File)obj; fileOperate(f,operate.getUser(),operateLogManager); }else if(obj instanceof Directory){ Directory dir = (Directory)obj; dirOperate(dir,operate.getUser(),operateLogManager);}}}}protected abstract void operateAuthority(BaseObj obj,User user);protected abstract void fileOperate(File f,User user,OperateLogManager operateLogManager) throws Exception;protected abstract void dirOperate(Directory dir,User user,OperateLogManager operateLogManager)throws Exception;}

