设计模式 模版方法模式 展现程序员的一天(二)

2014-11-23 20:27:29 · 作者: · 浏览: 14
{ return false; } /** * 离开公司 */ public void exitCompany() { if (isNeedPrintDate()) { System.out.print(new Date().toLocaleString()+-->); } System.out.println(name + 离开公司); }
超类中添加了一个isNeedPrintDate方法,且默认返回false,不打印时间。如果某子类需要调用打印时间,可以复写改钩子方法,返回true,比如,程序猿复写了这个方法:

package com.zhy.pattern.template;

public class ITWorker extends Worker
{

	public ITWorker(String name)
	{
		super(name);
	}

	@Override
	public void work()
	{
		System.out.println(name + 写程序-测bug-fix bug);
	}

	@Override
	public boolean isNeedPrintDate()
	{
		return true;
	}
	
}
最后再看下测试结果:

-----------------work start ---------------
鸿洋进入公司
鸿洋打开电脑
鸿洋写程序-测bug-fix bug
鸿洋关闭电脑
2014-5-19 19:17:05-->鸿洋离开公司
-----------------work end ---------------

好了,关于钩子,超类中可提供默认实现或者空实现,子类可覆盖或者不覆盖,具体根据需求来定。


最近恰好,再写一个爬虫程序,用到了模版方法模式,给大家分享下:

需求分析:程序需要对特定的20个网站进行抓取数据;每个网站页面返回的结果数据不同,url不同,参数不同等;但是抓取的过程是一致的。

于是我就这样的设计:

a、定义一个规则Rule类(包含了:url,params,request_method,以及返回哪块数据【根据选择器】)

b、通过Rule进行抓取数据

c、对数据进行处理

我把上面3个步骤定义了算法的骨架,b为超类实现,a、c由子类实现:

package com.zhy.pattern.template;

public abstract class AbsExtractInfo
{

	
	/**
	 * 抓取的算法骨架
	 */
	public void extract()
	{
		Rule rule = generateRule() ;
		List
  
    eles = getInfosByRule(rule);
		dealResult(eles);
	}
	
	/**
	 * 生成一个Rule
	 * @return
	 */
	public abstract Rule generateRule();
	
	/**
	 * 抓取的实现
	 * @param rule
	 * @return
	 */
	private List
   
     getInfosByRule(Rule rule) { // the implements omitted } /** * 处理抓取的结果 * @param results */ public void dealResult(List
    
      results); } 
    
   
  

其中GenerateRule这个方法,恰好是工厂模式中的抽象方法模式(定义一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法模式把类实例化的过程推迟到子类),如果你忘记了,可以查看设计模式 工厂模式 从卖肉夹馍说起

好了,就到这里,最后欢迎大家留言。