Template Method(模板方法)模式定義演算法骨架,將可變步驟延遲到子類實現。適用於:流程固定但細節多變、存在多個相似場景的場合。本文以 SEO 群發專案為例,展示如何用此模式消除重複代碼、提升擴展性。
系統需對多個論壇站點進行群發帖、群回覆以增加外鏈。站點數量未來不可預知,每個站點的發帖細節(HTTP 參數、表單欄位、驗證碼處理等)各不相同,但整體流程高度一致:
public interface ISitePost {
boolean postAll(List<Siteboards> boards, List<Siteusers> users, List<Postinfos> posts);
boolean replyAll(List<Articleinfos> articles, List<Siteusers> users, List<Postinfos> posts);
}
public abstract class AbstractSitePost implements ISitePost {
// 模板方法:定義固定流程
public boolean postAll(List<Siteboards> boards, List<Siteusers> users, List<Postinfos> posts) {
// 1. 群登錄
loginAll(users);
// 2. 遍歷版面發帖
for (Siteboards board : boards) {
Siteusers user = selectRandomUser(users);
Postinfos post = selectRandomPost(posts);
String result = post(user, board, post); // 交給子類實現
if (!isSuccess(result)) return false;
}
return true;
}
// 抽象方法:子類必須實現的站點特有發帖邏輯
protected abstract String post(Siteusers user, Siteboards board, Postinfos post);
// 共用輔助方法
private void loginAll(List<Siteusers> users) { ... }
private Siteusers selectRandomUser(List<Siteusers> users) { ... }
private boolean isSuccess(String result) { ... }
}
新增站點只需繼承 AbstractSitePost 並實作 post():
public class AAASitePost extends AbstractSitePost {
protected String post(Siteusers user, Siteboards board, Postinfos post) {
// AAA 站點專屬:構造 multipart/form-data、處理驗證碼、提交...
return httpClient.execute(postMethod);
}
}

(版權所有 hankchen)
Template Method 讓「變與不變」清晰分離,是框架設計與業務流程標準化的利器。