設計模式 - Template

Template模式:

  • 也就是模板模式,父類定義了主要框架,而子類可以根據這個框架進行拓展。

實例:

  • 在這裏父類AbstractDisplay,一共有四個方法,一個是begin(),輸出通知開始的字符串,一個是end(),用於輸出結束通知的字符串,一個是print() ,是抽象的方法,在這裏交給子類去實現,例如是輸出字符還是字符串,而display則是模板的主要輸出方法,將其他三個方法聯繫起來。

AbstractDisplay 抽象類:


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public abstract class AbstractDisplay {
	private String displayString;
	private Logger logger = LoggerFactory.getLogger(AbstractDisplay.class);
	public AbstractDisplay(String displayString) {
		this.displayString = displayString;
	}
	public void begin() {
		logger.info("{}","begin display : ");
	}
	public void end() {
		logger.info("{}","end display");
	}
	public abstract void print();
	public void display() {
		begin();
		print();
		end();
	}
	public String getDisplayString() {
		return displayString;
	}
	
}

CharDisplay 類:


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class CharDisplay extends AbstractDisplay{
	private Logger logger = LoggerFactory.getLogger(CharDisplay.class);
	public CharDisplay(String displayString) {
		super(displayString);
	}
	@Override
	public void print() {
		for(int i = 0 ;i < 5 ; i++) {
			logger.info("Char{} : {}",i,getDisplayString().charAt(0));
		}
	}
	
}

StringDisplay類:


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class StringDisplay extends AbstractDisplay{
	private Logger logger = LoggerFactory.getLogger(StringDisplay.class);
	public StringDisplay(String displayString) {
		super(displayString);
	}

	@Override
	public void print() {
		for(int i = 0 ;i < 5 ; i++) {
			logger.info("String{} : {}",i,getDisplayString());
		}
	}
	
}

測試用例以及結果:

public void templatePatternTest() {
		AbstractDisplay abstractDisplay = new CharDisplay("C");
		abstractDisplay.display();
		abstractDisplay = new StringDisplay("Char");
		abstractDisplay.display();
	}

17:41:08.211 [main] INFO com.zyy.admin.pojo.AbstractDisplay - begin display : 
17:41:08.214 [main] INFO com.zyy.admin.pojo.CharDisplay - Char0 : C
17:41:08.214 [main] INFO com.zyy.admin.pojo.CharDisplay - Char1 : C
17:41:08.214 [main] INFO com.zyy.admin.pojo.CharDisplay - Char2 : C
17:41:08.214 [main] INFO com.zyy.admin.pojo.CharDisplay - Char3 : C
17:41:08.214 [main] INFO com.zyy.admin.pojo.CharDisplay - Char4 : C
17:41:08.214 [main] INFO com.zyy.admin.pojo.AbstractDisplay - end display
17:41:08.214 [main] INFO com.zyy.admin.pojo.AbstractDisplay - begin display : 
17:41:08.215 [main] INFO com.zyy.admin.pojo.StringDisplay - String0 : Char
17:41:08.215 [main] INFO com.zyy.admin.pojo.StringDisplay - String1 : Char
17:41:08.215 [main] INFO com.zyy.admin.pojo.StringDisplay - String2 : Char
17:41:08.215 [main] INFO com.zyy.admin.pojo.StringDisplay - String3 : Char
17:41:08.215 [main] INFO com.zyy.admin.pojo.StringDisplay - String4 : Char
17:41:08.215 [main] INFO com.zyy.admin.pojo.AbstractDisplay - end display :

使用Template模式的好處:

  • 父類協同子類工作,父類規定了模板,當模板需要更改時,只需要修改父類模板即可。
  • 站在父類的角度思考,期待子類去實現抽象方法以及要求子類實現抽象方法,如實例,當一些複雜的操作可以作爲模板時,使用此模式可以省去子類的工作。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章