定义
定义一个操作中的算法的框架,而将一些步骤延迟到子类中。模版方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
结构和说明
AbstractClass:抽象类。用来定义算法骨架和原语操作。还提供算法中的通用的实现。
ConcreteClass : 具体实现类。用来实现算法骨架中的某些步骤,完成和特定子类相关的功能。
例子:
笔者在实现爬虫抓去的代码中,获取初始url,下载页面,解析页面内容,获取url流程是固定的,至于是用什么存储url以及用什么存储页面文章和图片,则交由具体的子类去负责。粗略代码如下 :
public abstract class AbsCrawler{
private final static Logger logger = LoggerFactory.getLogger(AbsCrawler.class);
/*
*获取初始的url,一般是通用的,从固定的文件中获取
*/
public void Initializer(){
File inputfile = new File(file_Addr);
try {
FileReader fr = new FileReader(inputfile);
BufferedReader br = new BufferedReader(fr);
String s;
while ((s = br.readLine()) != null) {
putUrl(s);
}
}catch(FileNotFoundException|IOException e){
logger.error(".....");
具体的一些处理
return或者抛出异常退出
}
}
/*
*下载页面
*param url 下载的地址
*/
public void getPage(String url);
/*
*
* 解析文件的内容
*/
public void getContent();
/*
*获取url
*/
public String getUrl();
/*
*param url 入库的url
*/
public void putUrl(String url);
}
public class DBCrawler extends AbsCrawler{
....使用redis存储url,mongodb存储无规则的页面内容
}
public class FileCrawler extends AbsCrawler{
....使用File存储url,mysql存储无规则的页面内容
}
>>当然,根据SRP设计原则,url存储和页面存储应当作为接口通过扩展和两者组合实现。可以搭配策略模式使用啦
No Final is final