在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模版方法使子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。模板就是一个方法。更具体的说,这个方法将算法定义成一组步骤,其中的任何步骤都可以是抽象的,由子类负责实现。这可以确保算法的结构保持不变,同时由子类提供部分实现。
1 。模版方法定义了算法的步骤,把这些步骤地实现延迟到子类。
2。模版方法模式为我们提供了一种代码复用的重要技巧。
3。模版方法的抽象类可以定义具体的方法,抽象的方法和钩子。
4。抽象方法由子类实现。
5。钩子是一种方法,它在抽象类中不做事,或者只做默认的事情,资料可以选择要不要去覆盖它。
6。为了防止子类改变模版方法中的算法,可以将模版声明为final。
7。好莱坞原则告诉我们,将决策权放在高层模块中,以便决定如何以及何时调用底层模块。
8。你将在真实世界 代码中看到模版方法模式的许多变体,不要期待他们全部是 一眼就可以被你认出的。
9。策略模式和模版方法模式都封装算法,一个用组合一个用继承。
10。工厂方法是模版方法的一种特殊版本。
package pattern;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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");
}
}
class Tea extends CaffeineBeverage{
public void brew(){
System.out.println("Steeping the tea");
}
public void addCondiments(){
System.out.println("Adding Lemon");
}
}
class Coffee extends CaffeineBeverage{
public void brew(){
System.out.println("Dripping Coffee through filter");
}
public void addCondiments(){
System.out.println("Adding Sugar and Milk");
}
}
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;
}
}
class TeaWithHook extends CaffeineBeverageWithHook{
public void brew(){
System.out.println("Steeping the tea");
}
public void addCondiments(){
System.out.println("Adding Lemon");
}
}
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.println("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;
}
}
package pattern;
public class BeverageTestDrive {
public static void main(String[] args) {
TeaWithHook teaHook=new TeaWithHook();
CoffeeWithHook coffeeHook=new CoffeeWithHook();
System.out.println("\nMaking tea...");
teaHook.prepareRecipe();
System.out.println("\nMaking coffee...");
coffeeHook.prepareRecipe();
}
}
package pattern;
import java.util.Arrays;
public class DuckSortTestDrive {
public static void main(String[] args) {
DuckSort[] ducks = { new DuckSort("Daffy", 8),
new DuckSort("Dewey", 2), new DuckSort("Howard", 7),
new DuckSort("Louie", 2), new DuckSort("Donald", 10),
new DuckSort("Huey", 2) };
System.out.println("Bdfore sorting:");
display(ducks);
Arrays.sort(ducks);
System.out.println("\nAfter sorting:");
display(ducks);
}
static void display(DuckSort[] ducks) {
for (int i = 0; i < ducks.length; i++) {
System.out.println(ducks[i]);
}
}
}
class DuckSort implements Comparable {
String name;
int weight;
public DuckSort(String name, int weight) {
this.name = name;
this.weight = weight;
}
public String toString() {
return name + " weighs " + weight;
}
public int compareTo(Object object) {
DuckSort otherDuck = (DuckSort) object;
if (this.weight < otherDuck.weight) {
return -1;
} else if (this.weight == otherDuck.weight) {
return 0;
} else {
return 1;
}
}
}
package pattern;
public class DuckTestDrive {
public static void main(String[] args) {
DuckInterface duck=new MallardDuckinterface();
WildTurkey turkey= new WildTurkey();
DuckInterface turkeyAdapter=new TurkeyAdapter(turkey);
Turkey duckAdapter=new DuckAdapter(duck);
System.out.println("The Turkey says...");
turkey.gobble();
turkey.fly();
System.out.println("\n The Duck says...");
testDuck(duck);
System.out.println("\n The TurkeyAdapter says...");
//testDuck(turkeyAdapter);
//turkeyAdapter.quack();
duckAdapter.fly();
}
static void testDuck(DuckInterface duck){
duck.quack();
duck.fly();
}
}
分享到:
相关推荐
行为型模式专注于类或对象间的交互和职责分配,如模板方法、命令、解释器、责任链、访问者、中介者、备忘录、观察者、状态和策略模式,它们定义了对象如何协作和执行任务。 状态机模式,也称为状态对象模式,是一种...
这个互联网时代的商业模式《免费》读书笔记PPT模板,可以帮助我们理解免费模式背后的商业逻辑,以及如何在互联网环境中运用这些模式创新和盈利。通过深入学习和实践,我们可以更好地应对未来的商业挑战。
在《JAVA与模式读书笔记》中,我们探讨的是Java编程语言与设计模式的结合应用,这对于深入理解面向对象编程和提升软件开发能力至关重要。设计模式是软件工程中的最佳实践,它们是解决常见问题的模板,可以提高代码的...
通过本书的读书笔记PPT模板,我们可以系统地理解和应用《社交红利》中的理论。 1. 社交网络的权重:信息的重量 在社交网络中,信息的重量并不只取决于内容本身的质量,更在于信息在社交网络中的传播力。这种传播力...
提供的《2小时学会DISC》读书笔记PPT模板,可能包含以下内容:书中的核心观点概述、每个行为风格的特点、如何根据不同风格调整沟通策略、案例分析以及实际应用的技巧。这个模板可以帮助读者整理学习心得,也可以用于...
产品设计是用户与产品间的直接情感联系,无论好坏,从汽车到烤面包机,产品设计是对产品质量和性能的诠释,本书作者认为真正的创新是增加用户使用和体验价值,并详细阐述了如何在设计...《创新设计》读书笔记ppt模板。
《农村电商:互联网 三农案例与模式》读书笔记模板.pptx
【C++读书笔记】 在深入理解C++的过程中,读书笔记是一种有效的学习方法,它能帮助我们整理思绪,巩固知识,并且在日后回顾时提供清晰的指引。以下是对C++编程语言的一些关键知识点的概述,这些内容可能涵盖在读书...
《重构商业:产业互联网时代的商业模式重构》读书笔记模板.pptx
* 《互联网管理案例集》读书笔记模板.pptx是关于互联网+管理案例集的读书笔记模板,涵盖了传统行业向“互联+”模式转型的典型路径。 * 本书所选取的十个典型案例,分别涉及金融、教育、交通运输、母婴用品、居民...
"《物联网移动App设计及开发实战》读书笔记模板" 《物联网移动App设计及开发实战》读书笔记模板是基于Android平台的物联网移动App设计及开发实战的读书笔记模板。该模板涵盖了物联网移动App设计及开发的各个方面,...
"《一本书读懂24种互联网创业模式》读书笔记模板" 《一本书读懂24种互联网创业模式》是一本关于互联网创业的书籍,书中对互联网行业的现状和发展趋势进行了深入的分析,并结合成功案例,提出了多种创业思路和模式。...
这份“《激荡30年》ppt读书笔记模板”是为读者提供了一种系统整理和学习这本书内容的工具,帮助读者更好地理解和消化书中的知识点。 在制作PPT读书笔记时,通常会包含以下几个关键部分: 1. **封面页**:通常包含...
这篇读书笔记PPT模板是基于华硕奇兵“硕市生”在《中欧商业评论》中的专访内容,旨在帮助读者深入理解华硕电脑中国业务总部的成功策略与商业洞见。《中欧商业评论》是一份权威的商业管理期刊,它以深度分析和独特...
综上,这个读书笔记模板探讨了时间、心智、现实和管理四个主题,提醒我们在面对生活挑战时,应理解时间的价值,培养良好的心智模式,接受现实,通过有效管理时间来逐步改善自我。通过这样的PPT模板,我们可以系统地...
"《单片机原理及应用系统设计》读书笔记模板" 《单片机原理及应用系统设计》读书笔记模板是基于STC89系列单片机的原理、应用系统设计和开发环境的详细介绍。该模板涵盖了单片机的结构原理、汇编指令系统、C51程序...
本资源摘要信息是一本关于电子商务概论的读书笔记模板,主要介绍了电子商务的基本概念、发展历程、功能与特性、社会效应、计算机基础知识、信息技术、新兴趋势、电子商务模式等方面的内容。 电子商务概论 电子商务...
"《重度垂直运营:移动互联网时代的垂直化运营实践》读书笔记模板.pptx" 《重度垂直运营:移动互联网时代的垂直化运营实践》读书笔记模板.pptx是关于垂直化运营的实践读书笔记模板,着重介绍了移动互联网时代的垂直...
3. 行为型模式:如策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、迭代器模式(Iterator)、访问者模式(Visitor)、责任链模式(Chain of Responsibility)、命令模式(Command...
读书笔记PPT模板则为读者提供了一个系统整理和记录阅读心得的框架,通过视觉化的形式加深对书本内容的理解。拖延症,一个普遍存在于现代生活中的问题,不仅影响个人效率,也常常导致压力增加和生活质量下降。以下是...