`
wangkechao.dream
  • 浏览: 44193 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
352630cf-f670-3416-b946-55dec5cd787c
设计模式
浏览量:28968
社区版块
存档分类
最新评论

5.设计模式之模板模式

阅读更多

 

模板模式

定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤

我的理解模板模式,定义了方法执行的总体步骤,但每一步的具体实现由子类复写

关键点:模板方法用关键字final 需要复写的方法用abstract 修饰

 

Example: 考试:三步:发卷,做卷,交卷 现在我们实现考历史和考数学的情况

 

钩子:

模板模式中有一个钩子的功能,所谓钩子就是某些情下执行这个模板步骤,但在某些情况下又去执行另外的步骤,以我们的为例,当你考数学的时候,发完试卷,老师总要说好好做题不要剽窃,这个时候就可以用到钩子了

 

1. 模板类

public abstract class ExaminationTemplate {

	public boolean hook = false;// 钩子

	// 模板方法
	final void templatMethod() {
		// 老师有话说
		if (hook) {
			givePapers();
			teacherSay();
			doPapers();
			handInPapers();
		} else {
			givePapers();
			doPapers();
			handInPapers();
		}
	}

	// 发卷
	abstract void givePapers();

	// 做卷
	abstract void doPapers();

	// 交卷
	abstract void handInPapers();

	// 师说
	abstract void teacherSay();

}

 2.历史考试

public class HistoryExamination extends ExaminationTemplate{
	@Override
	void givePapers() {
		System.out.println("分发历史试卷");
	}
	@Override
	void doPapers() {
		System.out.println("做历史试卷");
	}
	@Override
	void handInPapers() {
		System.out.println("上交历史试卷");
	}
	@Override
	void teacherSay() {
		
	}
}

3. 数学考试

public class MathExamination extends ExaminationTemplate{
	@Override
	void givePapers() {
		System.out.println("分发数学试卷");
	}
	@Override
	void doPapers() {
		System.out.println("做数学试卷");
	}
	@Override
	void handInPapers() {
		System.out.println("上交数学试卷");
	}
	@Override
	void teacherSay() {
		System.out.println("好好做题不要抄");
	}
}

4. 运行方法

public class Main {

	public static void main(String[] args) {
		//考个历史吧
		HistoryExamination historyExamination = new HistoryExamination();
		historyExamination.templatMethod();
		System.out.println("--------------------");
		//考个数学吧,老师有话说哟
		MathExamination mathExamination = new MathExamination();
		mathExamination.hook=true;
		mathExamination.templatMethod();
		
	}
}

 

结果:

 

 分发历史试卷
做历史试卷
上交历史试卷
--------------------
分发数学试卷
好好做题不要抄
做数学试卷
上交数学试卷

 

参考源文档 <http://blog.csdn.net/s464036801/article/details/8468926> ,此处致谢

返回导航

 

 

 

 

 

 

分享到:
评论
1 楼 CrazzyLee 2014-01-23  
这个例子好像不太恰当啊..
原定义:

定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤。

template类应该包含有abstractMethod以外(子类必须重写),应该有模板自身要完成的一些步骤,才更好的能阐述模板模式

相关推荐

Global site tag (gtag.js) - Google Analytics