虚假的MatchAll
在wurfl中有个matcher叫做:net.sourceforge.wurfl.core.matchers.CatchAllMatcher
实际上虽然这个类叫做cacheAll但是并不是如此的,首先请看到代码:
net.sourceforge.wurfl.core.classifiers.FilterChain:
public void filter(String userAgent, String deviceID) {
for (Iterator iterator = filters.iterator(); iterator.hasNext();) {
Filter filter = (Filter) iterator.next();
if (filter.canHandle(userAgent)) {
filter.filter(userAgent, deviceID);
break;
}
}
}
是那个break,实际上它的意思就是让每个明确的内容进入对应的filter中,这样利用matcher可以提高识别率或者其他的.
而在这里我想把一些虚拟的设备放进去,比如目前把UCWEB放进去了,下面是一些测试样例:
IUC(U;iOS 4.3.5;Zh-cn;320*480;)/UCWEB8.1.0.104/41/997
JUC (Linux; U; 2.3.4; zh-cn; GT-S5660; 320*480) UCWEB7.9.3.103/139/32160
我不希望去添加这些ua到patch中,这些ua太多了,而且意义不大,因为是同一个设备,至于怎么添加后面还有另外的解决方案这里先不提.
回到主题,我们现在就是要把break编程contiune就可以了,是这样的,但是wurfl有个很suck的地方,就是很多代码比较古老因此OO思想用的不好,比如:
FilterChain MatcherChina等这些类都没有接口方法,因此你只能直接extends这些类,问题是它的大部分属性又都是private的于是你不得不覆盖掉几乎所有的实现,现在我们就要覆盖实现了:
public void filter(String userAgent, String deviceID) {
for (Iterator iterator = filters.iterator(); iterator.hasNext();) {
Filter filter = (Filter) iterator.next();
if (filter.canHandle(userAgent)) {
filter.filter(userAgent, deviceID);
}
}
}
然后简单说下,怎么matcher的,现在这么改当然不能matcher,实际上你看过源码就知道,它的matcher是基于下面的组合:
Filter+Matcher+UserAgentNormalizer
Filter决定了有多少device可以被这个matcher查询,Matcher做的就是匹配设备,而我们这里的模糊匹配主要利用的这个地方,最后就是改变ua的序列化方法,你可以实现UserAgentNormalizer这个接口.
这些下一篇会详细介绍wurfl中关于matcher和filter的一些故事.
当然wurfl这个项目真的算不上优秀,很多代码质量比较差,需要一点点改.
对了最后提醒下上面这么改其实会有个害处就是初始化时间会大大加长,这个当然得益于list的遍历效率低下,这块也是需要之后再优化的,但好在这只是初始化时间,问题不是很大,之后也会介绍我是如何思考减少内存占用的方法,都不属于高科技的方法.