功能描述
封装了算法的骨架,让子类去做算法的实现。和建造者模式很像。
代码结构
UML类图
代码示例
假设需要做一份黄金蛋炒饭,鸡蛋和米饭怎么获取,这个由各个厨师自己决定,为了能够做出黄金蛋炒饭,厨师长控制了炒饭的制作步骤…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| public abstract class FriedRice {
abstract void getEgg();
abstract void getRice();
final void doFriedRice(){
System.out.println("准备制作黄金炒饭:先炒米饭,然后倒入鸡蛋液!"); this.getRice(); System.out.println("米饭下锅翻炒...");
this.getEgg(); System.out.println("将鸡蛋液倒入锅中翻炒...");
System.out.println("黄金炒饭制作完成!");
// System.out.println("准备制作普通炒饭:先炒鸡蛋,然后倒入米饭混合炒!"); // this.getEgg(); // System.out.println("将鸡蛋液倒入锅中翻炒..."); // // this.getRice(); // System.out.println("米饭下锅翻炒..."); // // System.out.println("普通炒饭制作完成!"); } }
|
如果改变了步骤,使用同样的原料就可以做出普通蛋炒饭了。
1 2 3 4 5 6 7 8 9 10 11
| public class GoldFriedRice extends FriedRice { @Override void getEgg() { System.out.println("从冰箱拿出鸡蛋!"); }
@Override void getRice() { System.out.println("从冰箱拿出昨天剩下的米饭!"); } }
|
1 2 3 4 5 6 7 8 9 10
| public class TestTempMethod {
public static void main(String[] args) {
FriedRice friedRice = new GoldFriedRice(); friedRice.doFriedRice();
} }
|
优缺点
优点:复用了代码,封装了不变的部分,将变化的部分延迟到了子类中实现,提高了扩展性。
缺点:使用了抽象类,每个不同的实现都需要一个子类,增加了复杂度。