最后为了解决这种多变的情况,又为了方便扩展,定义了一个接口如下:
public interface ParamHandler{ public String handler(String param);//处理参数,返回对应搜索格式字符串 }
然后先建一个关键词的处理类
public class KeywordHandler implements ParamHandler{ public String handler(String param){ //正则表达式匹配param是否是关键词的参数 //处理关键词参数返回url } }
当然,分页,城市,区域等筛选条件全部实现了ParamHandler接口,处理与KeywordHandler中相同,全部是用正则表达式进行匹配。
然后再Service中定义方法进行调用如下:
public class Service{ Listlist = new ArrayList (); public Service(){ list.add(new KeywordHandler()); list.add(new PageHandler()); //有多个处理类就依次add } public String splitUrl(String url){ String returnUrl = ""; String[] params = url.split("/"); for(String param : params){ returnUrl += this.handler(param); } return returnUrl; } public String handler(String url){ String tmp = ""; for(ParamHandler p : list){ tmp = p.handler(); if(tmp!=null&&!"".equals(tmp)){ return tmp; } } } }
这样,如果seo有需求对url做变动,我要做的就是增加或者删除处理类,唯一的不足就是循环的时候需要逐个循环,好在不是很多,对效率影响也可以忽略了,值得一提的是,springmvc中对controller请求的映射返回具体的controller也是这种思路,而不是适配器模式,只是一个适配的“接口”。
跑题了,本文讨论的是命令模式,之所以吸引我主要跟我的需求很贴近,与我上面的例子或多或少有点关系。
命令模式,commond,经典的例子,电视和遥控器。
对象电视:提供对外的功能有开、关和换频道,很简单的对象
public class TV{ public turnOn(){} public turnOff(){} public changeChannel(){} }
好了,现在我们要做的是把电视中这个3个命令抽象出来
public interface Commond{ public void execute(); }
public class TurnOnCommond implements Commond(){ private TV tv; public TurnOnCommond(TV tv){ this.tv = tv; } public void execute(){ tv.turnOn(); } }
依次3个命令如上实现,现在我们该实现遥控器了,遥控器里面会有三个命令,开,关,转换频道:
public class Controller(){ private TrunOnCommond turnOn; private TrunOffCommond trunOff; private ChangeChannelCommond changeChannel; public Controller(){ this.turnOn = new TrunOnCommond(); //略... } public void turnOn(){ trunOn.execute(); } //trunOff,changeChannel略 }
这样我们创建遥控器的时候,里面的命令已经为我们封装好了,其实在定义遥控器的时候,内部的命令可以由客户端来控制,这样invoker的角色功能也由客户端来定义,如果继续扩展,也可以定义遥控器的接口,至于优缺点网上有很多,本人没有亲自用过,没有什么心得体会,但是第一个例子和命令模式有些相似,只不过第一个例子中缺少了命令对象,直接在命令中做的处理,调用的方式我选择直接循环轮询所有的命令。