zgmf x11a regenerate:设计模式之模板方法模式

来源:百度文库 编辑:偶看新闻 时间:2024/04/30 10:53:15

话说新浪同学和腾讯同学是同桌。

有一天老师要给大家来个临时测验,由于没有事先准备,老师只好把试题抄写在黑板上,再由同学们自己抄写到练习本上,然后作答。

下面是新浪同学抄写并作答的试题:

[java] view plaincopyprint?
  1. public class SinaTest {  
  2.     public void test() {  
  3.         System.out.print("国内最牛的微博之一是?");  
  4.         System.out.println("新浪微博");  
  5.     }  
  6. }  

然后腾讯同学有点近视,看不清黑板,只好抄写新浪同学的试题:

[java] view plaincopyprint?
  1. public class TencentTest {  
  2.     public void test() {  
  3.         System.out.print("国内最牛的微博是?");  
  4.         System.out.println("腾讯微博");  
  5.     }  
  6. }  

由于腾讯同学比较慌忙,竟然将这一句中最为精妙的两个字漏掉了。

新浪同学和腾讯同学平时都不怎么爱学习,抄写感觉好累,新浪同学有点困了,眼睛都睁不开了,腾讯同学呢,也好不到哪里去,找了本书盖在头上,爬在桌上睡着了,书本上写了两个大字:隐身。

老师检查测验结果,于是有了以下代码:

[java] view plaincopyprint?
  1. public class Client {  
  2.     public static void main(String[] args) {  
  3.         SinaTest sina = new SinaTest();  
  4.         sina.test();  
  5.         TencentTest tencent = new TencentTest();  
  6.         tencent.test();  
  7.     }  
  8. }  

结果如下:

[html] view plaincopyprint?
  1. 国内最牛的微博之一是?新浪微博  
  2. 国内最牛的微博是?腾讯微博  

新浪同学比较生气:“腾讯,你小子好不谦虚啊!”,腾讯同学反驳道:“事实就是这样!”。两人为此要闹翻脸了。

老师觉得这样不太好,如果自己在黑板上抄错了,同学们岂不是都要重抄?老师为了解决这个问题,立刻去将试题印成了试卷,发给了新浪同学和腾讯同学:

[java] view plaincopyprint?
  1. public abstract class BaseTest {  
  2.       
  3.     public void ask() {  
  4.         System.out.println("国内最牛的微博之一是?" + answer());  
  5.     }  
  6.       
  7.     public abstract String answer();  
  8. }  

可以看到,老师已经将答案印好了,谁都不能改动了,新浪同学和腾讯同学只要老老实实的回答问题就行了:

[java] view plaincopyprint?
  1. public class SinaTest extends BaseTest {  
  2.   
  3.     @Override  
  4.     public String answer() {  
  5.         return "新浪微博";  
  6.     }  
  7.       
  8. }  
[java] view plaincopyprint?
  1. public class TencentTest extends BaseTest {  
  2.   
  3.     @Override  
  4.     public String answer() {  
  5.         return "腾讯微博";  
  6.     }  
  7.       
  8. }  

再来看看老师是怎么审核测试试卷的:

[java] view plaincopyprint?
  1. public class Client {  
  2.     public static void main(String[] args) {  
  3.         BaseTest sina = new SinaTest();  
  4.         BaseTest tencent = new TencentTest();  
  5.         sina.ask();  
  6.         tencent.ask();  
  7.     }  
  8. }  

看以看到,新浪同学和腾讯同学只要把试卷拿到手即可,然后开始回答问题,对于每个答案都有自己的回答的实现方式,这就好办多了。

我们来看看答题结果:

[html] view plaincopyprint?
  1. 国内最牛的微博之一是?新浪微博  
  2. 国内最牛的微博之一是?腾讯微博  

不知不觉中,新浪同学自己体验了一把一种设计模式:模板方法模式。

模板方法模式是通过把不变的的行为搬移到超类,去除子类中重复的代码来体现它的优势;当不变的和可变的行为在子类实现中混合在一起的时候,不变的行为就会在子类中重复实现,我们通过模板方法模式把这些行为搬移到单一的地方,这样就可以帮助子类摆脱重复不变行为的纠缠。

最后,顺便说一下,新浪同学和腾讯同学都是我的好朋友,所以我的学习成绩也不好,哈哈。