转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/26276093

不断设计模式~ Template Method模式

老套路,看高清:它定义的算法的骨架。虽然某些步骤推迟到子类中。不改变算法结构的情况下。又一次定义算法的步骤。

简单看下定义,模版方法定义了一个算法的步骤,而且同意子类为一个或多个步骤提供实现。

定义还算清晰,以下来个样例展示下本公司的上班情况(纯属娱乐,如有雷同。请对号入座)。简单描写叙述一下:本公司有程序员、測试、HR、项目经理等人,以下使用模版方法模式,记录下全部人员的上班情况:

首先来个超类,超类中定义了一个workOneDay方法。设置为作为算法的骨架:

package com.zhy.pattern.template;

public abstract class Worker
{
protected String name; public Worker(String name)
{
this.name = name;
} /**
* 记录一天的工作
*/
public final void workOneDay()
{ System.out.println("-----------------work start ---------------");
enterCompany();
computerOn();
work();
computerOff();
exitCompany();
System.out.println("-----------------work end ---------------"); } /**
* 工作
*/
public abstract void work(); /**
* 关闭电脑
*/
private void computerOff()
{
System.out.println(name + "关闭电脑");
} /**
* 打开电脑
*/
private void computerOn()
{
System.out.println(name + "打开电脑");
} /**
* 进入公司
*/
public void enterCompany()
{
System.out.println(name + "进入公司");
} /**
* 离开公司
*/
public void exitCompany()
{
System.out.println(name + "离开公司");
} }

定义了一个上班(算法)的骨架,包括下面步骤:

a、进入公司

b、打开电脑

c、上班情况

d、关闭电脑

e、离开公司

能够看到,a、b、d、e我们在超类中已经实现,子类仅实现work这个抽象方法,记录每天的上班情况。以下各类屌丝入场:

程序员:

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");
} }

HR:

package com.zhy.pattern.template;

public class HRWorker extends Worker
{ public HRWorker(String name)
{
super(name);
} @Override
public void work()
{
System.out.println(name + "看简历-打电话-接电话");
} }

測试人员:

package com.zhy.pattern.template;

public class QAWorker extends Worker
{ public QAWorker(String name)
{
super(name);
} @Override
public void work()
{
System.out.println(name + "写測试用例-提交bug-写測试用例");
} }

项目经理:

package com.zhy.pattern.template;

public class ManagerWorker extends Worker
{ public ManagerWorker(String name)
{
super(name);
} @Override
public void work()
{
System.out.println(name + "打dota...");
} }

以下我们測试下:

package com.zhy.pattern.template;

public class Test
{
public static void main(String[] args)
{ Worker it1 = new ITWorker("鸿洋");
it1.workOneDay();
Worker it2 = new ITWorker("老张");
it2.workOneDay();
Worker hr = new HRWorker("迪迪");
hr.workOneDay();
Worker qa = new QAWorker("老李");
qa.workOneDay();
Worker pm = new ManagerWorker("坑货");
pm.workOneDay(); }
}

输出结果:

-----------------work start ---------------
鸿洋进入公司
鸿洋打开电脑
鸿洋敲代码-測bug-fix bug
鸿洋关闭电脑
鸿洋离开公司
-----------------work end ---------------
-----------------work start ---------------
迪迪进入公司
迪迪打开电脑
迪迪看简历-打电话-接电话
迪迪关闭电脑
迪迪离开公司
-----------------work end ---------------
-----------------work start ---------------
老李进入公司
老李打开电脑
老李写測试用例-提交bug-写測试用例
老李关闭电脑
老李离开公司
-----------------work end ---------------
-----------------work start ---------------
坑货进入公司
坑货打开电脑
坑货打dota...
坑货关闭电脑
坑货离开公司
-----------------work end ---------------

好了,恭喜你,又学会一个设计模式。模版方法模式。

以下看下模版方法模式类图,和我们程序的类图:

模版方式里面也能够可选的设置钩子,比方如今希望记录程序猿离开公司的时间。我们就能够在超类中加入一个钩子:

public boolean isNeedPrintDate()
{
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<Element> eles = getInfosByRule(rule);
dealResult(eles);
} /**
* 生成一个Rule
* @return
*/
public abstract Rule generateRule(); /**
* 抓取的实现
* @param rule
* @return
*/
private List<Element> getInfosByRule(Rule rule)
{
// the implements omitted
}
/**
* 处理抓取的结果
* @param results
*/
public void dealResult(List<Element> results);
}

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

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

版权声明:本文博主原创文章。博客,未经同意不得转载。

设计模式 Template Method模式 显示程序猿的一天的更多相关文章

  1. 设计模式Template Method模式(Template Method)摘录

    23种子GOF设计模式一般分为三类:创建模式.结构模型.行为模式. 创建模式抽象的实例.怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化托付给还 ...

  2. Android 设计模式Template Method模式

    自定义模板方法模式:定义的算法的骨架中的方法,虽然某些步骤推迟到子类中,下模板方法允许子类不能改变在的情况下,该算法的结构.算法重新定义某些步骤. 设计原则:不要给我们打电话.我会打电话给你.(像猎头 ...

  3. 一天一个设计模式——模板方法(Template Method)模式

    一.模式说明 现实世界中的模板是用于将事物的结构规律予以固定化.标准化的成果,它体现了结构形式的标准化.例如镂空文字印刷的模板,通过某个模板印刷出来的文字字体大小都是一模一样,但是具体使用什么材质的颜 ...

  4. 设计模式(三)Template Method模式

    在父类中定义处理流程的框架,在子类中实现具体处理的模式就称为Template Method模式即模板方法模式. 根据下面的示例程序理解模板方法模式. package BigJunOba.bjtu.Te ...

  5. 设计模式之Template Method模式

    作用:将具体的处理交给子类 什么是Template Method模式? Template Method模式是指带有模板功能的模式,组成模板的方法被定义在父类中,且这些方法为抽象方法.子类去实现父类中的 ...

  6. 行为型设计模式之模板方法(TEMPLATE METHOD)模式 ,策略(Strategy )模式

    1 模板方法(TEMPLATE METHOD)模式: 模板方法模式把我们不知道具体实现的步聚封装成抽象方法,提供一些按正确顺序调用它们的具体方法(这些具体方法统称为模板方法),这样构成一个抽象基类.子 ...

  7. C++设计模式:Template Method

    我使用过一个简单的后台服务框架.这个框架上手很容易,我只需要继承一个基类,同时实现,或重写(override)基类声明的几个接口(这些接口声明为虚函数,或者纯虚函数),然后调用基类定义好的run()函 ...

  8. Template Method模式和Strategy模式有何异同

    Template Method模式和Strategy模式有何异同 博客分类: 设计模式 Java  Template Method模式很容易理解,就是由基类提供一个模板,将各子类中不变的行为提取到基类 ...

  9. Template Method模式和Strategy模式[继承与委托]

    继承 program by difference. 通过继承,可以建立完整的软件结构分层.其中每一层都可以重用该层次以上的Code. 过度使用继承的代价是巨大的.应使用组合或者委托来替代继承. Tem ...

随机推荐

  1. myeclipse中,项目上有个叉报错,文件没有错误

    同事将他的java项目交接给了我.和平时的交接一样.他把他最新的源码.打成压缩包,发给我. 我解压后.使用myeclipse开发工具.通过导入,将项目导入到我的开发工具中.这个时候有一个问题出现了.在 ...

  2. FusionCharts參数中文说明

    FushionCharts是把抽象数据图示化的套件,使用方便,配置简单.其相关參数中文说明例如以下. 功能特性 animation                    是否动画显示数据,默觉得 1( ...

  3. 【JAVA得知】struts2 于 Actionsupport 任务

    尊重原创:http://xumiao900.iteye.com/blog/469760     Action 跟 Actionsupport 的差别      当我们在写action的时候,能够实现A ...

  4. openwrt教程 第一章 物联网&amp;openwrt开发概述

    1.1 我们的宗旨 互联网.移动互联网的时代已经过去,物联网的时代已经来临!2014年,是物联网元年,2016年,物联网将达到高潮!为了迎接该潮流,我们工作室(F403科技创意室:http://f40 ...

  5. 二叉树3种递归和非递归遍历(Java)

    import java.util.Stack; //二叉树3种递归和非递归遍历(Java) public class Traverse { /******************一二进制树的定义*** ...

  6. msyql在查询字段中的所有记录,不重复

    mysql> select * from a ;  +----+------+--------------+ | id | name | descri       | +----+------+ ...

  7. Android定位功能(二)

    在前文Android定位功能(一)中,已经大致介绍了一下在Android平台中,和定位功能相关的类,并举例获取了位置信息.但是前文是基于Criteria定制了一个标准,通过getBestProvide ...

  8. 重新想象 Windows 8 Store Apps (26) - 选取器: 自定义文件选取窗口, 自定义文件保存窗口

    原文:重新想象 Windows 8 Store Apps (26) - 选取器: 自定义文件选取窗口, 自定义文件保存窗口 [源码下载] 重新想象 Windows 8 Store Apps (26) ...

  9. 重新想象 Windows 8 Store Apps (24) - 文件系统: Application Data 中的文件操作, Package 中的文件操作, 可移动存储中的文件操作

    原文:重新想象 Windows 8 Store Apps (24) - 文件系统: Application Data 中的文件操作, Package 中的文件操作, 可移动存储中的文件操作 [源码下载 ...

  10. 升级到cocos2d-x 2.0.2代码差异

    来自:http://www.cnblogs.com/TopWin/archive/2012/09/12/2682042.html 近期看cocos2d-x 2.0.2公布后升级了一下.升级后发现又出现 ...