功能描述

封装了算法的骨架,让子类去做算法的实现。和建造者模式很像。

代码结构

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();

}
}

优缺点

优点:复用了代码,封装了不变的部分,将变化的部分延迟到了子类中实现,提高了扩展性。

缺点:使用了抽象类,每个不同的实现都需要一个子类,增加了复杂度。