话说新浪同学和腾讯同学是同桌。
有一天老师要给大家来个临时测验,由于没有事先准备,老师只好把试题抄写在黑板上,再由同学们自己抄写到练习本上,然后作答。
下面是新浪同学抄写并作答的试题:
- public class SinaTest {
- public void test() {
- System.out.print("国内最牛的微博之一是?");
- System.out.println("新浪微博");
- }
- }
然后腾讯同学有点近视,看不清黑板,只好抄写新浪同学的试题:
- public class TencentTest {
- public void test() {
- System.out.print("国内最牛的微博是?");
- System.out.println("腾讯微博");
- }
- }
由于腾讯同学比较慌忙,竟然将这一句中最为精妙的两个字漏掉了。
新浪同学和腾讯同学平时都不怎么爱学习,抄写感觉好累,新浪同学有点困了,眼睛都睁不开了,腾讯同学呢,也好不到哪里去,找了本书盖在头上,爬在桌上睡着了,书本上写了两个大字:隐身。
老师检查测验结果,于是有了以下代码:
- public class Client {
- public static void main(String[] args) {
- SinaTest sina = new SinaTest();
- sina.test();
- TencentTest tencent = new TencentTest();
- tencent.test();
- }
- }
结果如下:
- 国内最牛的微博之一是?新浪微博
- 国内最牛的微博是?腾讯微博
新浪同学比较生气:“腾讯,你小子好不谦虚啊!”,腾讯同学反驳道:“事实就是这样!”。两人为此要闹翻脸了。
老师觉得这样不太好,如果自己在黑板上抄错了,同学们岂不是都要重抄?老师为了解决这个问题,立刻去将试题印成了试卷,发给了新浪同学和腾讯同学:
- public abstract class BaseTest {
- public void ask() {
- System.out.println("国内最牛的微博之一是?" + answer());
- }
- public abstract String answer();
- }
可以看到,老师已经将答案印好了,谁都不能改动了,新浪同学和腾讯同学只要老老实实的回答问题就行了:
- public class SinaTest extends BaseTest {
- @Override
- public String answer() {
- return "新浪微博";
- }
- }
- public class TencentTest extends BaseTest {
- @Override
- public String answer() {
- return "腾讯微博";
- }
- }
再来看看老师是怎么审核测试试卷的:
- public class Client {
- public static void main(String[] args) {
- BaseTest sina = new SinaTest();
- BaseTest tencent = new TencentTest();
- sina.ask();
- tencent.ask();
- }
- }
看以看到,新浪同学和腾讯同学只要把试卷拿到手即可,然后开始回答问题,对于每个答案都有自己的回答的实现方式,这就好办多了。
我们来看看答题结果:
- 国内最牛的微博之一是?新浪微博
- 国内最牛的微博之一是?腾讯微博
不知不觉中,新浪同学自己体验了一把一种设计模式:模板方法模式。
模板方法模式是通过把不变的的行为搬移到超类,去除子类中重复的代码来体现它的优势;当不变的和可变的行为在子类实现中混合在一起的时候,不变的行为就会在子类中重复实现,我们通过模板方法模式把这些行为搬移到单一的地方,这样就可以帮助子类摆脱重复不变行为的纠缠。
转:http://blog.csdn.net/liuhe688/article/details/6591176