HeadFirst设计模式之模板方法模式
一、
1.The Template Method defines the steps of an algorithm and allows subclasses to provide the implementation for one or more steps.
2.The Template Method Pattern defi nes the skeleton of an algorithm in a method, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.
3.With a hook, I can override the method, or not. It’s my choice.If I don’t, the abstract class provides a default implementation.
4.
二、
1.
package headfirst.designpatterns.templatemethod.barista; 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");
}
}
2.
package headfirst.designpatterns.templatemethod.barista; public abstract class CaffeineBeverageWithHook { final void prepareRecipe() {
boilWater();
brew();
pourInCup();
if (customerWantsCondiments()) {
addCondiments();
}
} abstract void brew(); abstract void addCondiments(); void boilWater() {
System.out.println("Boiling water");
} void pourInCup() {
System.out.println("Pouring into cup");
} boolean customerWantsCondiments() {
return true;
}
}
3.
package headfirst.designpatterns.templatemethod.barista; public class Coffee extends CaffeineBeverage {
public void brew() {
System.out.println("Dripping Coffee through filter");
}
public void addCondiments() {
System.out.println("Adding Sugar and Milk");
}
}
4.
package headfirst.designpatterns.templatemethod.barista; import java.io.*; public class CoffeeWithHook extends CaffeineBeverageWithHook { public void brew() {
System.out.println("Dripping Coffee through filter");
} public void addCondiments() {
System.out.println("Adding Sugar and Milk");
} public boolean customerWantsCondiments() { String answer = getUserInput(); if (answer.toLowerCase().startsWith("y")) {
return true;
} else {
return false;
}
} private String getUserInput() {
String answer = null; System.out.print("Would you like milk and sugar with your coffee (y/n)? "); BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
try {
answer = in.readLine();
} catch (IOException ioe) {
System.err.println("IO error trying to read your answer");
}
if (answer == null) {
return "no";
}
return answer;
}
}
5.
package headfirst.designpatterns.templatemethod.barista; public class Tea extends CaffeineBeverage {
public void brew() {
System.out.println("Steeping the tea");
}
public void addCondiments() {
System.out.println("Adding Lemon");
}
}
6.
package headfirst.designpatterns.templatemethod.barista; import java.io.*; public class TeaWithHook extends CaffeineBeverageWithHook { public void brew() {
System.out.println("Steeping the tea");
} public void addCondiments() {
System.out.println("Adding Lemon");
} public boolean customerWantsCondiments() { String answer = getUserInput(); if (answer.toLowerCase().startsWith("y")) {
return true;
} else {
return false;
}
} private String getUserInput() {
// get the user's response
String answer = null; System.out.print("Would you like lemon with your tea (y/n)? "); BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
try {
answer = in.readLine();
} catch (IOException ioe) {
System.err.println("IO error trying to read your answer");
}
if (answer == null) {
return "no";
}
return answer;
}
}
7.
package headfirst.designpatterns.templatemethod.barista; public class BeverageTestDrive {
public static void main(String[] args) { Tea tea = new Tea();
Coffee coffee = new Coffee(); System.out.println("\nMaking tea...");
tea.prepareRecipe(); System.out.println("\nMaking coffee...");
coffee.prepareRecipe(); TeaWithHook teaHook = new TeaWithHook();
CoffeeWithHook coffeeHook = new CoffeeWithHook(); System.out.println("\nMaking tea...");
teaHook.prepareRecipe(); System.out.println("\nMaking coffee...");
coffeeHook.prepareRecipe();
}
}
8.
三、The Hollywood Principle and Template Method
1.The Hollywood Principle Don’t call us, we’ll call you.
2.
3.
4.
5.
四、Sorting with Template Method
1.
package headfirst.designpatterns.templatemethod.sort; public class Duck implements Comparable<Duck> {
String name;
int weight; public Duck(String name, int weight) {
this.name = name;
this.weight = weight;
} public String toString() {
return name + " weighs " + weight;
} public int compareTo(Duck object) { Duck otherDuck = object; if (this.weight < otherDuck.weight) {
return -1;
} else if (this.weight == otherDuck.weight) {
return 0;
} else { // this.weight > otherDuck.weight
return 1;
}
}
}
五、JFrame中的templateMethod的hook方法
1.If you haven’t encountered JFrame, it’s the most basic Swing container and inherits
a paint() method. By default, paint() does nothing because it’s a hook! By overriding
paint(), you can insert yourself into JFrame’s algorithm for displaying its area of the
screen and have your own graphic output incorporated into the JFrame. Here’s
an embarrassingly simple example of using a JFrame to override the paint() hook
method:
2.
package headfirst.designpatterns.templatemethod.frame; import java.awt.*;
import javax.swing.*; public class MyFrame extends JFrame {
private static final long serialVersionUID = 2L; public MyFrame(String title) {
super(title);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setSize(300,300);
this.setVisible(true);
} // JFrame’s update algorithm calls paint(). By
// default, paint() does nothing... it’s a hook.
// We’re overriding paint(), and telling the
// JFrame to draw a message in the window.
public void paint(Graphics graphics) {
super.paint(graphics);
String msg = "I rule!!";
graphics.drawString(msg, 100, 100);
} public static void main(String[] args) {
MyFrame myFrame = new MyFrame("Head First Design Patterns");
}
}
六、Applet的hook方法
1.Concrete applets make extensive use of hooks to supply their
own behaviors. Because these methods are implemented as
hooks, the applet isn’t required to implement them.
2.
package headfirst.designpatterns.templatemethod.applet; import java.applet.Applet;
import java.awt.Graphics; public class MyApplet extends Applet {
private static final long serialVersionUID = 2L;
String message; public void init() {
message = "Hello World, I'm alive!";
repaint();
} public void start() {
message = "Now I'm starting up...";
repaint();
} public void stop() {
message = "Oh, now I'm being stopped...";
repaint();
} public void destroy() {
message = "Goodbye, cruel world";
repaint();
} public void paint(Graphics g) {
g.drawString(message, 5, 15);
}
}
3.
七、
1.
Q: When I’m creating a template method, how do I know when to use abstract methods and when to use hooks?
A: Use abstract methods when your subclass MUST provide an implementation of the method or step in the algorithm.
Use hooks when that part of the algorithm is optional. With hooks, a subclass may choose to implement that hook, but it doesn’t have to.
2.
Q: This implementation of sorting
actually seems more like the Strategy
Pattern than the Template Method
Pattern. Why do we consider it
Template Method?
A: You’re probably thinking that
because the Strategy Pattern uses object
composition. You’re right in a way – we’re
using the Arrays object to sort our array, so
that’s similar to Strategy. But remember,
in Strategy, the class that you compose
with implements the entire algorithm. The
algorithm that Arrays implements for sort
is incomplete; it needs a class to fill in the
missing compareTo() method. So, in that
way, it’s more like Template Method.
3.
Q: Are there other examples of
template methods in the Java API?
A: Yes, you’ll find them in a few
places. For example, java.io has a read()
method in InputStream that subclasses
must implement and is used by the tempate
method read(byte b[], int off, int len).
4.
The Strategy and Template Method Patterns both encapsulate algorithms, one by inheritance and one by composition.
HeadFirst设计模式之模板方法模式的更多相关文章
- 乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)
原文:乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 模板方法模式(Template Method ...
- 折腾Java设计模式之模板方法模式
博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...
- js设计模式——6.模板方法模式与职责链模式
js设计模式——6.模板方法模式与职责链模式 职责链模式
- [C++设计模式]template 模板方法模式
模板法模式:定义一个操作中的算法骨架.而将一些步骤延迟到子类中. 依照<headfirst 设计模式>的样例.煮茶和煮咖啡的算法框架(流程)是一样的.仅仅是有些算法的实现是不一样的,有些是 ...
- java设计模式之模板方法模式
模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.通俗的说的就是有很多相同的步骤的,在某一些地方可能有一些差 ...
- C#设计模式(14)——模板方法模式(Template Method)
一.引言 提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简 ...
- 【GOF23设计模式】模板方法模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_模板方法模式.钩子函数.方法回调.好莱坞原则 package com.test.templateMethod; publi ...
- [设计模式] 22 模板方法模式 template
转http://www.jellythink.com/archives/407 在GOF的<设计模式:可复用面向对象软件的基础>一书中对模板方法模式是这样说的:定义一个操作中的算法骨架,而 ...
- java_设计模式_模板方法模式_Template Method Pattern(2016-08-11)
定义: 定义一个操作中算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤.这里的算法的结构,可以理解为你根据需求设计出来的业务流程.特定的步骤就是指那些 ...
随机推荐
- Spring Mvc模式下Jquery Ajax 与后台交互操作
1.基本代码 1)后台控制器基本代码 @Controller @RequestMapping("/user") public class UserController { @Aut ...
- lex&yacc3
YACC yacc $$ translate relation ================================================================== ...
- Poj OpenJudge 百练 1860 Currency Exchang
1.Link: http://poj.org/problem?id=1860 http://bailian.openjudge.cn/practice/1860 2.Content: Currency ...
- app配置智能硬件的解决方案
随着越来越多的智能硬件产品上市,越来越多的硬件都戴上了智能的帽子,什么智能插座,智能音箱,智能称等等.凡是所谓的智能,都是通过wifi或者蓝牙来连接互联网,其中蓝牙也只能算是手机的附属品吧.主要还是硬 ...
- Android:启动引导页实现
前言 基本上现在所有的应用都会有一个欢迎界面,在欢迎界面对应用做一个整体的介绍,然后在跳入到主界面,这次要说的这个引导页就是带翻页的引导页.效果如下所示
- VB.Net 文件处理类
1.编写日志 2.本地文件的读取和写入 3.Base64与图片的互相转换 Imports System.IO Imports System.Text Public Class Cls_File #Re ...
- Spark Tungsten揭秘 Day1 jvm下的性能优化
Spark Tungsten揭秘 Day1 jvm下的性能优化 今天开始谈下Tungsten,首先我们需要了解下其背后是符合了什么样的规律. jvm对分布式天生支持 整个Spark分布式系统是建立在分 ...
- Spark Streaming揭秘 Day4-事务一致性(Exactly one)
Spark Streaming揭秘 Day4 事务一致性Exactly one 引子 对于业务处理系统,事务的一致性非常的关键,事务一致性(Exactly one),简单来说,就是输入数据一定会被处理 ...
- 在MVVMLight框架的ViewModel中实现NavigationService
网上已经有很多方法了,比如通过Messenger来实现等等.这里我只讲述一种我比较喜欢的方法,因为它很方便 首先定义一个ViewModel基类,将所有ViewModel子类继承这个基类.在基类中定义 ...
- 利用IDE编写C语言程序的一点注意事项
前言:我是喜欢编程的一只菜鸟,在自学过程中,对遇到的一些问题和困惑,有时虽有一点体会感悟,但时间一长就会淡忘,很不利于知识的积累.因此,想通过博客园这个平台,一来记录自己的学习体会,二来便于向众多高手 ...