学习《疯狂android讲义》中“连连看游戏”的实现时,作者说游戏中一处的实现用到了模板方法模式。 于是我就参阅了《易学设计模式》和《java与模式》两书中对模板方法模式的讲解。

    要了解模板方法模式,必须先了解抽象类。

    有两点可能初学者容易忽略:

        1、 抽象类中是可以有具体的实现方法的。

       2、抽象类不能实例化,只能由继承它的子类来实例化。

        模板方法模式的实现理解起来很简单,就是一个抽象类,类里面一个具体的实现方法加几个抽象的方法。具体的实现方法会调用其它几个抽象的方法。而抽象的方法的具体实现则由其子类来完成。

           晕了吧 ? 呵呵 ……专业的说法是这样的:定义一个算法的骨架,而将具体的算法延迟到子类中来实现。

    那么模板方法模式会用在哪里呢?

      模板方法的影子在这些东东里可以找到:Spring的JdbcTemplate,Spring的HibernateTemplate ,Servlet中也会用到!

     所有的framework都是遵循好莱坞原则设计的,否则就不叫framework。framework使用控制反转的目的:

 

  1. 对基于接口编程的支持
  2. 减少单件和抽象工厂的依赖
  3. 降低业务和框架的耦合
  4. 业务组件可复用,可插拔

      比如说:有一个报表打印程序,用户规定必须打印表头、正文、表尾 3部分。

        如果用到模版方法模式,其代码如下:

  1.  
  2. public abstract class Report {  
  3.     public void print(){  
  4.         printTitle();  
  5.         printBody();  
  6.         printTail();  
  7.     }  
  8.     public abstract void printTitle();  
  9.     public abstract void printBody();  
  10.     public abstract void printTail();  
  11. }  
  1.  
  2. public class ReportImpl extends Report{  
  3.     @Override 
  4.     public void printTitle() {  
  5.           
  6.         System.out.println("采用一种方式打印表头");  
  7.     }  
  8.     @Override 
  9.     public void printBody() {  
  10.           
  11.         System.out.println("采用一种方式打印正文");  
  12.     }  
  13.     @Override 
  14.     public void printTail() {  
  15.           
  16.         System.out.println("采用一种方式打印表尾");  
  17.     }  
  18.     public static void main(String[] args) {  
  19.         Report report=new ReportImpl();  
  20.         report.print();  
  21.     }  
  22. }  

 当然如果需要还可以采用其实的方式来打印。这样就实现了代码的复用。

“不要给我们打电话,我们会给你打电话(don‘t call us, we‘ll call you)”这是著名的好莱坞原则。在好莱坞,把简历递交给演艺公司后就只有回家等待。由演艺公司对整个娱乐项的完全控制,演员只能被动式的接受公司的差使,在需要的环节中,完成自己的演出。

于是在程序设计时,这一点是很重要的:

每当定义一个新的子类时,不要按照控制流程的思路去想,应当按照“责任”的思路去想。