一、示例代码
Car.java
package com.it.pattern;
public abstract class Car {
public abstract void fire(); //打火
public abstract void run(); //行驶
public abstract void stop(); //停止
//模板
public void drive(){
fire();
run();
stop();
}
}
BMW.java
package com.it.pattern;
public class BMW extends Car{
@Override
public void fire() {
System.out.println("bwm fire");
}
@Override
public void run() {
System.out.println("bmw run");
}
@Override
public void stop() {
System.out.println("bmw stop");
}
}
Test.java
package com.it.pattern;
public class Test {
public static void main(String[] args) {
Car c = new BMW();
c.drive();
}
}
二、模板模式
模板模式是类的行为模式。
1.定义:定义一个操作中算法的骨架(或称为顶级逻辑),将一些步骤(或称为基本方法)的执行延迟到其子类中。
2.模板模式与继承
模板方法恰当地使用继承。此模式可以用来改写一些拥有相同功能的相关的类,将可复用的一般行为代码移到基类里面,而把特殊化的行为代码移到子类里面。
3. 模板模式中的方法
1)模板方法:必须由抽象类实现,该方法是一个顶级逻辑,调用任意多个基本方法。子类不应该修改该方法。
2)基本方法:模板方法所调用的方法,又可细分为抽象方法、具体方法、钩子方法。
抽象方法:强迫子类重写的
具体方法:不需要子类重写的,最好声明为final
钩子方法:子类可以重写的,一般是个空方法(钩子方法的命名应该以do开头,这是一个通用规范)
补充:模板模式的设计理念是尽量减少必须由子类置换掉的基本方法的数量(可以理解为尽量减少抽象方法和钩子方法的数量)
4. 重构的原则
总的原则:行为上移,状态下移(抽象类中的具体方法应该尽量多,而成员变量应该尽量少)
1)应当根据行为而不是状态定义一个类
2)在实现行为时,应该尽量用取值方法获取成员变量,而不是直接应用成员变量
3)给操作划分层次,一个类的行为应当放到一个小组核心方法里面,这些方法可以很方便地在子类中置换
4)将状态的确认推迟到子类中去
5. 使用模板模式,用多态取代条件转移(也可以使用策略模式)
6. 模板模式和策略模式的区别
模板模式:原理为:子类对象的方法覆盖了父类的方法(父类对象调用子类方法)
策略模式:确定操作的方法和策略,策略的具体实现行为不同。通过组合实现。原理就是:组合大于继承,实现更大的灵活性。