学习《疯狂android讲义》中“连连看游戏”的实现时,作者说游戏中一处的实现用到了模板方法模式。 于是我就参阅了《易学设计模式》和《java与模式》两书中对模板方法模式的讲解。
要了解模板方法模式,必须先了解抽象类。
有两点可能初学者容易忽略:
1、 抽象类中是可以有具体的实现方法的。
2、抽象类不能实例化,只能由继承它的子类来实例化。
模板方法模式的实现理解起来很简单,就是一个抽象类,类里面一个具体的实现方法加几个抽象的方法。具体的实现方法会调用其它几个抽象的方法。而抽象的方法的具体实现则由其子类来完成。
晕了吧 ? 呵呵 ……专业的说法是这样的:定义一个算法的骨架,而将具体的算法延迟到子类中来实现。
那么模板方法模式会用在哪里呢?
模板方法的影子在这些东东里可以找到:Spring的JdbcTemplate,Spring的HibernateTemplate ,Servlet中也会用到!
所有的framework都是遵循好莱坞原则设计的,否则就不叫framework。framework使用控制反转的目的:
- 对基于接口编程的支持
- 减少单件和抽象工厂的依赖
- 降低业务和框架的耦合
- 业务组件可复用,可插拔
比如说:有一个报表打印程序,用户规定必须打印表头、正文、表尾 3部分。
如果用到模版方法模式,其代码如下:
- public abstract class Report {
- public void print(){
- printTitle();
- printBody();
- printTail();
- }
- public abstract void printTitle();
- public abstract void printBody();
- public abstract void printTail();
- }
- public class ReportImpl extends Report{
- @Override
- public void printTitle() {
- System.out.println("采用一种方式打印表头");
- }
- @Override
- public void printBody() {
- System.out.println("采用一种方式打印正文");
- }
- @Override
- public void printTail() {
- System.out.println("采用一种方式打印表尾");
- }
- public static void main(String[] args) {
- Report report=new ReportImpl();
- report.print();
- }
- }
当然如果需要还可以采用其实的方式来打印。这样就实现了代码的复用。
“不要给我们打电话,我们会给你打电话(don‘t call us, we‘ll call you)”这是著名的好莱坞原则。在好莱坞,把简历递交给演艺公司后就只有回家等待。由演艺公司对整个娱乐项的完全控制,演员只能被动式的接受公司的差使,在需要的环节中,完成自己的演出。
于是在程序设计时,这一点是很重要的:
每当定义一个新的子类时,不要按照控制流程的思路去想,应当按照“责任”的思路去想。