意图:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
结构:
其中AbstractClass 实现为:
public abstract class AbstractClass { final void templateMethod(){ primitiveOperation1(); primitiveOperation2(); concreteOperation(); hook();//钩子 } abstract void primitiveOperation1(); abstract void primitiveOperation2(); final void concreteOperation(){ //这里是实现 } void hook(){ } }
先看我们一个例子,我们要进行泡茶和泡咖啡,我们会如何进行操作:
咖啡:
1.把水煮沸
2.用沸水冲泡咖啡粉
3.把咖啡倒进杯子
4.加糖和咖啡
public class Coffee { void prepareRecipe(){ boilWater(); brewCoffeeGrinds(); pourInCup(); addSugarAndMilk(); } public void boilWater(){ System.out.println("Boiling Water"); } public void brewCoffeeGrinds(){ System.out.println("Dripping Coffee through filter"); } public void pourInCup(){ System.out.println("Pouring into cup"); } public void addSugarAndMilk(){ System.out.println("Adding Sugar and Milk"); } }
茶:
1.把水煮沸
2.用沸水浸泡茶叶
3.把茶倒进杯子
4.加柠檬
public class Tea { void prepareRecipe(){ boilWater(); steepTeaBag(); pourInCup(); addLemon(); } public void boilWater(){ System.out.println("Boiling Water"); } public void steepTeaBag(){ System.out.println("Steeping the tea"); } public void pourInCup(){ System.out.println("Pouring into cup"); } public void addLemon(){ System.out.println("Adding Lemon"); } }
我们会发现其实有相同的方法,我们将其抽象化,其实我们发现咖啡的brewCoffeeGrinds()和茶的steepTeaBag()其实都是泡的动作,然后在发现咖啡的addSugarAndMilk()和茶的addLemon()都是加原料的动作,我们可以将这两个动作brew()和addCondiments()方法,我们将其代码写出:
public abstract class CaffeineBeverage { final void prepareRecipe() { boilWater(); brew(); pourInCup(); addCondiments(); } abstract void brew(); abstract void addCondiments(); void boilWater() { System.out.println("Boiling water"); } void pourInCup() { System.out.println("Pouring into cup"); } }
brew()方法和addCondiments()方法由子类方法延迟实现。
上面有一个hook()方法,我们到底何时使用钩子这个方法呢?就是一些步骤进行可以选择的时候。
下面我们将介绍模板方法和策略模式的一些不同点:
1.模板方法使用的继承模式,策略模式使用的是对象组合模式。
2.模板方法依赖度比策略高。
总结:
1.为防止子类修改模板方法的算法,可以将模板方法声明为final.
2.其中模板方法模式运用了好莱坞原则。
3.策略模式和模板方法模式都封装了算法,但是模板方法模式使用继承,而策略模式使用对象组合模式。
4.其实工厂方法是一种特殊的模板方法的版本。
发表评论
-
《Head.First设计模式》的学习笔记(17)-综合例子
2012-02-12 00:53 0例子: -
《Head.First设计模式》的学习笔记(16)--复合模式
2012-02-12 00:51 0意图: -
《Head.First设计模式》的学习笔记(15)--代理模式
2012-02-13 00:03 1158意图: 为另一个对象提供一个替身或占位符得以访问这个对象。 ... -
《Head.First设计模式》的学习笔记(14)--状态模式
2012-02-12 20:24 1240意图:允许对象在内部状态改变时改变她的行为,对象看起来好像修改 ... -
《Head.First设计模式》的学习笔记(13)--组合模式
2012-02-12 17:49 839先说一下题外话,这个模式是我学的最累的模式,代码纠结无比,而且 ... -
《Head.First设计模式》的学习笔记(12)--迭代器模式
2012-02-12 15:30 746意图:提供一种方法顺序访问一个聚合对象中的各个元素,而又不 ... -
《Head.First设计模式》的学习笔记---前言
2012-02-11 23:36 0headfist系列博客从这篇--模版方法模式开始自己写的了, ... -
《Head.First设计模式》的学习笔记(10)--外观模式
2012-02-11 23:30 669意图:为子系统中的一组接口提供一个一致的界面,Facade ... -
《Head.First设计模式》的学习笔记(9)--适配器模式
2012-02-11 23:27 735软件开发中经常遇到的 ... -
《Head.First设计模式》的学习笔记(8)--命令模式
2012-02-11 22:55 726背景:有时候我们需要对方法进行封装,通过对这些封装的方法进行调 ... -
《Head.First设计模式》的学习笔记(7)--单件模式
2012-02-11 13:55 915背景:有一些对象其实我们只需要一个,比方说:线程池(threa ... -
《Head.First设计模式》的学习笔记(6)--抽象工厂模式
2012-02-11 13:37 847意图:提供一个接口,用于创建相关或依赖对象的家族,而不需要明 ... -
《Head.First设计模式》的学习笔记(5)--工厂方法模式
2012-02-10 23:58 753意图:定义一个用于创建对象的接口,让子类决定实例化哪一 ... -
《Head.First设计模式》的学习笔记(4)--装饰者模式
2012-02-10 23:40 806意图:动态地将责任 ... -
《Head.First设计模式》的学习笔记(3)--观察者模式
2012-02-10 23:27 724意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改 ... -
《Head.First设计模式》的学习笔记(2)--策略模式
2012-02-10 23:09 625先对策略模式有一个总体认识。 意图:定义一系列的算法,把它们 ... -
《Head.First设计模式》的学习笔记(1)
2012-01-31 21:53 7831、慢一点,你理解的越 ...
相关推荐
### Head.First 设计模式学习笔记知识点总结 #### 一、设计模式概述 设计模式是一种用于解决软件设计中常见问题的标准化方法。通过采用设计模式,开发者可以提高代码的复用性、灵活性和可维护性。《Head First 设计...
《HeadFirst设计模式学习笔记1--策略模式Demo》 在软件工程中,设计模式是一种解决常见问题的标准方案,它提供了一种在特定情况下组织代码的模板。策略模式是设计模式中的一种行为模式,它允许在运行时选择算法或...
在“HeadFirst 设计模式学习笔记3--装饰模式 Demo”中,作者通过实例讲解了装饰模式的基本概念、结构和应用场景。这篇文章可能是从CSDN博客平台上的一个链接访问的,遗憾的是,由于我们当前无法直接访问该链接,所以...
总的来说,HeadFirst设计模式的学习笔记2关于观察者模式的演示,旨在帮助开发者理解如何使用观察者模式来构建可扩展的系统。通过实际的代码示例,我们可以更深入地掌握这一模式,并将其应用到日常开发中,提升代码的...
《HeadFirst设计模式学习笔记》是一份详尽的资料,旨在帮助读者深入理解并掌握设计模式这一编程领域的核心概念。设计模式是软件工程中的一种最佳实践,它在解决常见问题时提供了一种标准的解决方案,使得代码更易于...
《Head First设计模式》是一本深受开发者喜爱的设计模式学习书籍,它以易懂且生动的方式介绍了23种经典设计模式。这些模式是软件工程中经过实践验证的最佳实践,旨在提高代码的可重用性、可读性和可维护性。下面,...
读书笔记:设计模式学习笔记和代码。《图解设计模式》《Head First 设计模式》
在《Head First 设计模式学习笔记(十四)模式的组合使用》中,作者探讨了如何在实际编程中灵活地组合多种设计模式以解决复杂问题。这篇文章可能是基于《Head First 设计模式》这本书的一个章节,该书是设计模式领域...
《Head First 设计模式》是软件开发领域内一本广受欢迎的书籍,由Eric Freeman、Elisabeth Robson、Bert Bates和Kathy Sierra四位作者共同撰写。这本书以其独特的视觉风格和易于理解的教学方法,深入浅出地介绍了...
以上只是《Head First Servlets & JSP》一书中的部分核心知识点,实际内容还包括过滤器、监听器、MVC设计模式、JSTL等更广泛的主题,旨在帮助读者全面理解和掌握Servlet和JSP技术。通过深入学习,开发者能够构建高效...
本项目为《Head First 设计模式》的Java语言学习笔记与实战练习源码集合,包含104个文件,主要包括88个Java源文件、12个Markdown文档、3个XML配置文件及少量其他辅助文件。内容涵盖设计模式的学习笔记以及相应的代码...
《HeadFirst设计模式笔记》是深入理解软件设计思想的一份宝贵资料,主要涵盖了设计模式这一核心编程概念。设计模式是经过实践验证的解决方案模板,用于解决在软件开发中经常遇到的问题,尤其在面向对象设计中。这篇...
著名的《Head First Design Pattern》学习笔记,摘要这本书中的设计思路。由于书本过长,整理出笔记帮助回想起设计模式。文件是docx格式,只能由OFFICE Word 2007之后的版本打开,内附Visio类图文件。本文由个人整理...
通过以上对“Head First设计模式”书中可能涉及的设计模式的介绍,我们可以看出这本书是学习面向对象设计模式的绝佳资源。无论是初学者还是有一定经验的开发人员,都能从中受益匪浅。理解并熟练运用这些模式能够帮助...
【Servlet&JSP基础知识】 ...以上是`head_first_servlet&jsp`学习笔记的主要知识点,涵盖了Servlet和JSP的基础、Web应用架构、MVC模式、会话管理和JSP编程等多个方面,为深入理解和实践Servlet与JSP开发奠定了基础。
### LotusDomino学习笔记知识点概览 #### 1. 选取视图的列的内容 (@Trim @DbColumn) - **@Trim**: 是一个内置的LotusScript函数,用于去除字符串两端的空白字符。 - **@DbColumn**: 此函数用于获取指定列的信息。...
它支持多种图像格式,并提供了调整图像大小、位置和显示模式的能力。然而,如果你想要实现更复杂的交互或动画效果,单纯使用PictureBox可能就无法满足需求了。这时,我们就需要通过继承来创建一个新控件,增加额外的...
本学习笔记将深入探讨如何在C#中创建事件,以实现一个棒球模拟系统的例子。在这个系统中,我们将关注投球手、观众和裁判的交互,当输入棒球的轨迹和距离时,这些对象会根据模拟结果做出相应的反应。 首先,理解事件...