先簡單介紹Template Method模式的內容和應用場景。
Template Method模式也叫模板方法模式,它把具有特定步驟算法中的某些必要的處理委讓給抽象方法 ,通過子類繼承對抽象方法的不同實現改變整個算法的行為。
在作為抽象類的父類裡,定義了一個具有固定算法並可以細分為多個步驟的模板方法(public), Template Method模式把這些可以被細分的可變步驟抽象為可以被子類重載的抽象方法(protected abstract),並通過在子類中的重載(重新定義),做到無需改變模板方法的算法步驟而可以重新定義該 算法中的某些特定的步驟。
Template Method模式的UML圖如下:
(注意:版權所有hankchen)
Template Method模式一般應用在具有以下條件的應用中:
1. 具有統一的操作步驟或操作過程
2. 具有不同的操作細節
3. 存在多個具有同樣操作步驟的應用場景,但某些具體的操作細節卻各不相同
前一段時間,做了一個SEO的項目,需要到一些站點發帖回復增加外鏈的數目,期望提高搜索引擎的排 名順序。先不管這個項目的可行性和定位,現在只談涉及的設計技術(模式與重構)。
由於涉及多個站點(SitePost),並且站點的數目未來是不可預知的,這是開發中的一個變數。為了 以後的可擴展性,下面是部分設計圖:
(注意:版權所有hankchen)
在接口ISitePost中定義了每個站點類必須具備群發帖、群回復的功能。
群發帖的接口:
public boolean postAll(List<Siteboards> childboard, List<Siteusers> users, List<Postinfos> postinfos);
群回復的接口:
public boolean replyAll(List<Articleinfos>articles, List<Siteusers> users, List<Postinfos> postinfos, );
現在以群發帖的接口為例,在抽象類AbstractSitePost中采用Template Method模式實現了這個接口。
之所以,采用這個模板方法,是因為每個站點群發帖的過程,或者說步驟,是一樣的:
1. 首先的群登錄(隨機取代理IP)
2. 然後是,針對站點的每個版面,隨機用一個賬號和一個帖子來提交。
這些過程是相同的,不同的是:每個站點的發帖細節不同(即post方法不同)。
具體發帖的post方法定義如下:
Protected abstract String post(Siteusers userinfo,Siteboards sb,Postinfos postinfo);
這樣,具體到AAA站點(AAASitePost類),只需要實現自己的post方法即可。