设计模式 Template Method模式 显示程序猿的一天
转载请注明出处: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模式 显示程序猿的一天的更多相关文章
- 设计模式Template Method模式(Template Method)摘录
23种子GOF设计模式一般分为三类:创建模式.结构模型.行为模式. 创建模式抽象的实例.怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化托付给还 ...
- Android 设计模式Template Method模式
自定义模板方法模式:定义的算法的骨架中的方法,虽然某些步骤推迟到子类中,下模板方法允许子类不能改变在的情况下,该算法的结构.算法重新定义某些步骤. 设计原则:不要给我们打电话.我会打电话给你.(像猎头 ...
- 一天一个设计模式——模板方法(Template Method)模式
一.模式说明 现实世界中的模板是用于将事物的结构规律予以固定化.标准化的成果,它体现了结构形式的标准化.例如镂空文字印刷的模板,通过某个模板印刷出来的文字字体大小都是一模一样,但是具体使用什么材质的颜 ...
- 设计模式(三)Template Method模式
在父类中定义处理流程的框架,在子类中实现具体处理的模式就称为Template Method模式即模板方法模式. 根据下面的示例程序理解模板方法模式. package BigJunOba.bjtu.Te ...
- 设计模式之Template Method模式
作用:将具体的处理交给子类 什么是Template Method模式? Template Method模式是指带有模板功能的模式,组成模板的方法被定义在父类中,且这些方法为抽象方法.子类去实现父类中的 ...
- 行为型设计模式之模板方法(TEMPLATE METHOD)模式 ,策略(Strategy )模式
1 模板方法(TEMPLATE METHOD)模式: 模板方法模式把我们不知道具体实现的步聚封装成抽象方法,提供一些按正确顺序调用它们的具体方法(这些具体方法统称为模板方法),这样构成一个抽象基类.子 ...
- C++设计模式:Template Method
我使用过一个简单的后台服务框架.这个框架上手很容易,我只需要继承一个基类,同时实现,或重写(override)基类声明的几个接口(这些接口声明为虚函数,或者纯虚函数),然后调用基类定义好的run()函 ...
- Template Method模式和Strategy模式有何异同
Template Method模式和Strategy模式有何异同 博客分类: 设计模式 Java Template Method模式很容易理解,就是由基类提供一个模板,将各子类中不变的行为提取到基类 ...
- Template Method模式和Strategy模式[继承与委托]
继承 program by difference. 通过继承,可以建立完整的软件结构分层.其中每一层都可以重用该层次以上的Code. 过度使用继承的代价是巨大的.应使用组合或者委托来替代继承. Tem ...
随机推荐
- 十分钟搞懂什么是CGI(转)
原文:CGI Made Really Easy,在翻译的过程中,我增加了一些我在学习过程中找到的更合适的资料,和自己的一些理解.不能算是严格的翻译文章,应该算是我的看这篇文章的过程的随笔吧. CGI真 ...
- Oracle练习
--声明一个变量,并给它赋值 declare v_bonus number(8); begin select id*6 into v_bonus from A where Id=5; DBMS_OU ...
- 设计模式之迭代器模式(Iterator)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- hdu1664 Different Digits
求出n的倍数m,要求m使用的不同数字最少,且最小. 一开始不知道怎么搜,因为不知道m由多少个不同的数字组成. 然后百度了一下,看到和数论有关. m可能使用的数字的个数可能为一个或者两个 a,aa,aa ...
- CSS检测的高像素密度屏幕设备
iPhone4尽管是640px解析度,但它的屏幕宽度(device-width)目前只有320px和iPhone3G相同.只是iPhone4S的像素密度2. 然后使用meta viewport什么时候 ...
- C语言static 具体分析
google在最后三页C语言static内容,可找到的资料非常少.无论是长篇大论不知所云的话,在关键位置或跳过,习的人来说參考性不是非常大.所以.我这篇博文博採众家之长,把互联网上的资料整合归类,并亲 ...
- 苹果公司的新的编程语言 Swift 高级语言(十一)--初始化类的析构函数的一个实例
一 .实例的初始化 实例的初始化是准备一个类.结构或枚举的实例以便使用的过程. 初始化包含设置一个实例的每个存储属性为一个初始值,以及运行不论什么其他新的实例可以使用之前须要的设置或 ...
- Keepalived 配置和使用
keepalived主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现.keepalived主要目的在于,其自身启动一个服务,能够实现 ...
- 【剑指offer】q50:树节点最近的祖先
#@ root: the root of searched tree #@ nodeToFind: the tree-node to be found #@ path: the path from r ...
- Sliverlight实例之 使用 ControlTemplate 自定义按钮的外观
按钮,最终效果,如下图: 见Project21_ButtonSkin 1, 创建Sliverlight项目 说明: generic.xaml:样式和模板就被定义在这个文件里 MyButton.cs:控 ...