自定义模板方法模式:定义的算法的骨架中的方法,虽然某些步骤推迟到子类中,下模板方法允许子类不能改变在的情况下,该算法的结构。算法重新定义某些步骤。

设计原则:不要给我们打电话。我会打电话给你。(像猎头与求职者,求职者并不需要招聘,搜索会发现,你只需要工作)坞原则

引用一个样例,一个店中有两饮料:咖啡和茶。他们的冲泡方法

第一步:都是要用沸水

第二步:用热水泡咖啡或茶

第三步:把饮料倒进杯子

第四步:在饮料中增加适当的调料

在上面的步骤中一、三是一样的,能够抽取出来放在基类中,二、四不一样,能够抽象出来,让子类去实现,下面是饮料抽象的父类,父类能够让未知的子类去做它本身可能完毕的不好或者根本完毕不了的事情。能够加一个钩子函数:custcomerWantsCondiments(),请子类去重写。

CoffeineBeverageWithHook.java

package com.dzt.template;

/**
* 因为有的客户有可能不须要调料,这时就须要让客户去选择是否来加入调料,须要
*
* @author Administrator
*
*/
public abstract class CoffeineBeverageWithHook { void prepareRecipe() {
boilWater();
brew();
pourInCup();
if (custcomerWantsCondiments())
addCondiments();
} abstract void brew(); // 冲泡 abstract void addCondiments(); // 加入调料 // 烧开水
void boilWater() {
System.out
.println("CoffeineBeverageWithHook-------------------->boilWater");
} // 把饮料倒进杯子
void pourInCup() {
System.out
.println("CoffeineBeverageWithHook-------------------->pourInCup");
} /**
* 子类能够重载这个函数
*
* @return
*/
boolean custcomerWantsCondiments() {
return true;
}
}

下面是咖啡类。继承了上面的饮料父类

CoffeineWithHook.java

package com.dzt.template;

public class CoffeineWithHook extends CoffeineBeverageWithHook {

	@Override
void brew() {
// TODO Auto-generated method stub
System.out.println("CoffeineWithHook-------------------->brew");
} @Override
void addCondiments() {
// TODO Auto-generated method stub
System.out
.println("CoffeineWithHook-------------------->addCondiments");
} @Override
boolean custcomerWantsCondiments() {
// TODO Auto-generated method stub
return false;
} }

下面是茶类,继承了上面的饮料父类

TeaWithHook.java

package com.dzt.template;

public class TeaWithHook extends CoffeineBeverageWithHook {

	@Override
void brew() {
// TODO Auto-generated method stub
System.out.println("TeaWithHook-------------------->brew");
} @Override
void addCondiments() {
// TODO Auto-generated method stub
System.out.println("TeaWithHook-------------------->addCondiments");
} @Override
boolean custcomerWantsCondiments() {
// TODO Auto-generated method stub
return true;
} }

以上代码能够去改动custcomerWantsCondiments()函数,由用户决定是否须要加入调料

測试代码

package com.dzt.template;

/**
* 模板方法模式 在模板方法中加入钩子方法。让用户决定
*
* @author Administrator
* @date 2014.08.20
*/
public class TemplateMain { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
CoffeineWithHook coffHook = new CoffeineWithHook();
TeaWithHook teaHook = new TeaWithHook();
coffHook.prepareRecipe();
System.out
.println("---------------------------------------------------------------");
teaHook.prepareRecipe();
} }

总结:

1、模板方法是一种代码复用的基本技术。它们在类库中尤为重要,它们提取了类库中的公共行为。

2、模板方法导致一种方向控制结构,"好莱坞法则":"Don't call me,i will call you.",即一个父类调用子类的操作。而不是相反。

3、模板调用操作的类型有详细的操作,详细的AbstracClass操作,原语操作。工厂方法,钩子操作。少定义原语操作。

4、模板方法使用继承来改变算法的一部分。策略模式使用托付来改变整个算法。

相关代码:http://download.csdn.net/detail/deng0zhaotai/7835511

参考书:《Head First 设计模式》

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

Android 设计模式Template Method模式的更多相关文章

  1. 设计模式 Template Method模式 显示程序猿的一天

    转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/26276093 不断设计模式~ Template Method模式 老套路,看高清 ...

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

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

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

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

  4. 设计模式之Template Method模式

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

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

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

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

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

  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. crashRpt用法

    从官网上下载crashRpt的源代码,按说明编译出对应的lib和dll 1 在编译crashRpt的时候,在环境变量中设置  crashrptDir=D:\work\AIW\WebMicaps\Web ...

  2. Java开发环境的基本设置

    作为Java的刚開始学习的人,不知道其它的刚開始学习的人有没有和我一样的感受:用Java开发须要配置这么复杂 的环境.太难了.第一次配置时,一团混乱.Oracle监听服务打不开了,PLSql连接不上O ...

  3. nginx subrequest演示示例程序

    只有简单subrequest应用演示示例. nginx.conf文件: #user nobody; worker_processes 1; #error_log logs/error.log; #er ...

  4. htc one x刷机记录

    这几天有些空余时间都用来刷htc one x,来说说刷机的艰难史吧. 首先是利用百度云rom刷机,本来一直用小米系统,突然发现百度云也能够搞个,所以心血来潮要刷个百度云,先利用软件解锁,哪知道没细致看 ...

  5. HQApi命令行接口配置

    执行的命令行前准备 在您的个人文件夹中第一次创建 型材client.properties 如下面 cd C:\Users\scnyli\ mkdir ".hq" 创建一个 clie ...

  6. 【SICP读书笔记(一)】正则序展开的特殊情况

    scheme解释器有两种实现方式,一种是应用序,先对每个参数求值,再以首过程对所有求得的参数求值. 第二种是正则序,会“完全展开然后归约”(书中原文) SICP中的练习1.5,让我困惑了一下.原题如下 ...

  7. style.display table-row与block

    <tr id="js_rowShow" style=" display:none"> </tr> 问题: display:设置成bloc ...

  8. hdu2377Bus Pass(构建更复杂的图+spfa)

    主题链接: 啊哈哈,点我点我 思路: 题目是给了非常多个车站.然后要你找到一个社区距离这些车站的最大值最小..所以对每一个车站做一次spfa.那么就得到了到每一个社区的最大值,最后对每一个社区扫描一次 ...

  9. hdu 1298 T9(特里+DFS)

    pid=1298" target="_blank" style="">题目连接:hdu 1298 T9 题目大意:模拟手机打字的猜想功能.依据概 ...

  10. VisualStudioOnline协同工作流程

    VisualStudioOnline协同工作流程 项目负责人登陆自己的vsonline新建项目就不多说了. 直接从邀请队友开始 项目负责人操作 被邀请的邮箱必须是微软的邮箱(也就是可以登录visual ...