定義:定義一個操作中的算法的骨架,而将一些步驟延遲到子類中,使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。
優點:1.封裝不變部分,擴充可變部分
2.提取公共部分代碼,便于維護
缺點:1.提高了系統的複雜度。
使用場景:一些方法通用,一些方法不通用,卻在每一個子類都重新寫了這所有的方法。
類圖:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iZhdDMlBjNhRTOhdTY0YTOmlTZ0MWN0QDM0IjNzMjYz8CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
模闆代碼:
抽象模闆類
1.
2. static abstract class AbstractTemplate {
3.
4. //公有方法 但是可以複寫
5. protected void operateA() {
6. System.out.println("A");
7. }
8.
9. protected void operateB() {
10. System.out.println("B");
11. }
12.
13. //不同的方法
14. protected abstract void operateC() ;
15.
16. // 聲明為final方法,避免子類覆寫
17. // 固定的步驟
18. public final void templateMehthod() {
19. this.operateA();
20. this.operateB();
21. this.operateC();
22. }
23. }
具體實作類A
1.
2. static class ConcreteClassA extends AbstractClass {
3. @Override
4. protected void operateC() {
5. System.out.println("C");
6. }
7. }
具體實作類B
1.
2. static class ConcreteClassB extends AbstractClass {
3. @Override
4. protected void operateB() {
5. System.out.println("B+");
6. }
7.
8. @Override
9. protected void operateC() {
10. System.out.println("C");
11. }
12. }
栗子
1.
2. static abstract class AbstractPlayLol {
3.
4. protected void openComputer() {
5. System.out.println("開機了");
6. }
7.
8. protected void playGame() {
9. System.out.println("開始玩");
10. }
11.
12. //結果不相同
13. protected abstract void over() ;
14.
15. // 聲明為final方法,避免子類覆寫
16. public final void templateMehthod() {
17. this.openComputer();
18. this.playGame();
19. this.over();
20. }
21. }
抽象實作
1.
2. static class ConcreteClassA extends AbstractPlayLol {
3.
4. @Override
5. protected void over() {
6. System.out.println("15投");
7. }
8. }
1. static class ConcreteClassB extends AbstractPlayLol {
2.
3. @Override
4. protected void openComputer() {
5. System.out.println("電腦壞了");
6. }
7.
8. @Override
9. protected void playGame() {
10. System.out.println("沒玩上");
11. }
12.
13. @Override
14. protected void over() {
15. System.out.println("沒玩上");
16. }
17. }
18.
19.
調用
1. class Client {
2. public static void main(String[] args) {
3. AbstractPlayLol playA= new ConcreteClassA();
4. cookVegetable.cook();
5.
6. AbstractPlayLol playB= new ConcreteClassB();
7. cookVegetable.cook();
8. }