將具體處理交給子類的 Template Method模式

Template Method模式

應用場景

  • 當我們要完成在某一細節層次一致的一個過程或一系列步驟,但其個別步驟在更詳細的層次上的實現可能不同的時候,我們通常要考慮用模板方法模式解決。

本質

  • 父類定義框架,子類具體處理

優點

  • 實現代碼複用

缺點

  • 算法骨架不容易升級(模板和子類是非常耦合的,如要對模板中的算法骨架進行變更,會影響子類變化)

角色

  • AbstractClass:
    定義多個抽象方法、一個模板方法
  • ConcreteClass:
    具體實現AbstractClass的抽象方法,會被AbstractClass的模板方法所調用

Template Method模式的類圖

在這裏插入圖片描述

示例程序

示例程序的類圖

在這裏插入圖片描述

示例代碼
package templateMethod;

public abstract class AbstractDisplay {
	public abstract void open();
	public abstract void print();
	public abstract void close();
	public  void display() {
		open();
		for(int i=0;i<5;i++) {
			print();
		}
		close();
	}
}
package templateMethod;

public class CharDisplay extends AbstractDisplay {

	private char ch;
	
	public CharDisplay(char ch) {
		this.ch = ch;
	}

	@Override
	public void open() {
		System.out.print("<<");
	}

	@Override
	public void print() {
		System.out.print(ch);

	}

	@Override
	public void close() {
		System.out.println(">>");

	}
}
package templateMethod;

public class StringDisplay extends AbstractDisplay {

	private String str;
	private int width;
	
	public StringDisplay(String str) {
		super();
		this.str = str;
		this.width = str.getBytes().length;
	}

	private void printLine() {                          
        System.out.print("+");                         
        for (int i = 0; i < width; i++) {              
            System.out.print("-");                     
        }
        System.out.println("+");                       
    }
	@Override
	public void open() {
		printLine();
	}

	@Override
	public void print() {
		System.out.println("|" + str + "|"); 
	}

	@Override
	public void close() {
		printLine();
	}
}
package templateMethod;

public class Main {

	public static void main(String[] args) {
		AbstractDisplay d1=new CharDisplay('H');
		AbstractDisplay d2=new StringDisplay("Hello,world!");
		d1.display();
		d2.display();
	}
}

拓展思路

邏輯處理通用化
  • 在父類的模板方法中編寫算法,子類僅僅需要具體化抽象方法
父類、子類一致性
  • 使用父類變量保存子類實例,很好的滿足了里氏代換原則

相關的設計模式

Factory Method模式
  • Factory Method模式是Template Method 模式用於生成實例的一個典型例子。
Strategy模式
  • 在Template Method模式中,使用繼承改變程序的行爲
  • 在Strategy模式中,使用委託改變程序的行爲,Strategy模式用於替換整個算法

滿足的原則

  • 開放封閉原則
  • 單一職責原則
  • 里氏代換原則
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章