今天來(lái)看一下2012.11.7的后三次提交品追,這三次提交做的事情是比較統(tǒng)一的:用RequestExtractor抱环、ContentRequestExtractor数尿、XPathRequestExtractor另伍、HeaderRequestExtractor宪睹、UriRequestExtractor來(lái)替代了ContentMatcher扫腺、HeaderRequestMatcher岗照、XPathRequestMatcher、Header笆环、XPath攒至。
新加入了一個(gè)接口:RequestExtractor。
public interface RequestExtractor {
String extract(HttpRequest request);
}
ContentRequestExtractor躁劣、XPathRequestExtractor迫吐、HeaderRequestExtractor實(shí)現(xiàn)了這個(gè)接口,重寫(xiě)了extractor()方法账忘。這個(gè)方法的作用就是從請(qǐng)求中提取出xpath志膀、header或者stream熙宇,表達(dá)會(huì)更加準(zhǔn)確。再由以上三種extractor生成EqRequestMatcher對(duì)象溉浙,從這一步和以前的實(shí)現(xiàn)方式是統(tǒng)一的烫止,所以作者無(wú)需改動(dòng)測(cè)試類的調(diào)用方法。這也是這份代碼寫(xiě)的好的地方之一戳稽,一直在遵循一個(gè)原則馆蠕,把接口的方法與內(nèi)部方法隔離開(kāi),耦合很低惊奇,所以當(dāng)內(nèi)部擴(kuò)展時(shí)互躬,并不會(huì)改變外部的調(diào)用。
public class EqRequestMatcher implements RequestMatcher {
private RequestExtractor extractor;
private String expected;
public EqRequestMatcher(RequestExtractor extractor, String expected) {
this.extractor = extractor;
this.expected = expected;
}
@Override
public boolean match(HttpRequest request) {
return this.expected.equals(extractor.extract(request));
}
}
之所以把這幾個(gè)類由matcher轉(zhuǎn)變成extractor颂郎,就是因?yàn)檫@幾個(gè)extractor的作用和and/or吼渡、get/post、EqRequestMatcher起到的作用不同乓序,他們不應(yīng)該在同一層中出現(xiàn)寺酪。不過(guò)這次改動(dòng)也把之前幾個(gè)matcher的組合模式變成了類組合模式,并不嚴(yán)格遵守組合模式竭缝。設(shè)計(jì)模式也是為了解耦合房维,易擴(kuò)展沼瘫,可讀性強(qiáng)抬纸,如果有其他更好的方式實(shí)現(xiàn),何樂(lè)而不為呢耿戚?不應(yīng)該為了使用設(shè)計(jì)模式而使用設(shè)計(jì)模式湿故,本末倒置。