模板方法模式
模板方法模式的定義
1.定義:
定義一個操作中的算法的骨架,而將一些步驟延遲到子類中;模板方法使得子類可以不改變一個算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟
所有的重復(fù)的代碼上升到父類去,而不是讓每個子類都去重復(fù)
模板方法使通過把不變行為搬到超類,去除子類中的重復(fù)代碼來體現(xiàn)它的優(yōu)勢,提供了一個很好的代碼復(fù)用的平臺,當(dāng)不變的和可變的行為在方法中的子類實現(xiàn)中混在一起的時候,不變的行為就會在子類中重復(fù)出現(xiàn);我們通過模板方法把這些行為搬到單一的地方,這樣就可以幫助子類拜托重復(fù)的不變行為的糾纏
模板方法模式結(jié)構(gòu)圖
image-20210316143359876.png
模板方法模式的實現(xiàn)
代碼結(jié)構(gòu)圖
image-20210316143509453.png
1.新建一個抽象父類TestPaper 對應(yīng)模板方法中的AbstractClass,定義算法的骨架及子類重定義的方法
package org.example.template;
/**
* @author
* @date 2021/3/16 14:00
**/
public class TestPaper {
public void TestQuestion1(){
System.out.println("第一題");
System.out.println("答案是:"+Answer1());
}
public void TestQuestion2(){
System.out.println("第二題");
System.out.println("答案是:"+Answer2());
}
public void TestQuestion3(){
System.out.println("第三題");
System.out.println("答案是:"+Answer3());
}
public void TestQuestion4(){
System.out.println("第四題");
System.out.println("答案是:"+Answer4());
}
//抽象行為給子類去實現(xiàn)
protected String Answer1(){
return "";
}
protected String Answer2(){
return "";
}
protected String Answer3(){
return "";
}
protected String Answer4(){
return "";
}
}
2.新建具體的TestPaperA及TestPaper對應(yīng)模板方法模式的ConcreteClass,并實現(xiàn)父類定義給子類實現(xiàn)的方法
public class TestPaperA extends TestPaper{
@Override
protected String Answer1() {
return "a";
}
@Override
protected String Answer2() {
return "b";
}
@Override
protected String Answer3() {
return "c";
}
@Override
protected String Answer4() {
return "d";
}
}
public class TestPaperB extends TestPaper{
@Override
protected String Answer1() {
return "d";
}
@Override
protected String Answer2() {
return "c";
}
@Override
protected String Answer3() {
return "b";
}
@Override
protected String Answer4() {
return "a";
}
}
3.客戶端調(diào)用
package org.example.template;
/**
* @author
* @date 2021/3/16 14:17
**/
public class Client {
public static void main(String[] args) {
System.out.println("學(xué)生A答案如下:");
//用父類接收,多態(tài)
TestPaper testPaperA = new TestPaperA();
testPaperA.TestQuestion1();
testPaperA.TestQuestion2();
testPaperA.TestQuestion3();
testPaperA.TestQuestion4();
System.out.println("學(xué)生B答案如下:");
TestPaper testPaperB = new TestPaperB();
testPaperB.TestQuestion1();
testPaperB.TestQuestion2();
testPaperB.TestQuestion3();
testPaperB.TestQuestion4();
}
}
4.運行結(jié)果
image-20210316144024455.png
模板方法的優(yōu)缺點
優(yōu)點
1.把不可改變的封裝起來,把能夠改變的擴展開來,符合開閉原則
2.把很多類的共同操作給封裝起來,利于維護
3.其實我們發(fā)現(xiàn),我們在定義行為時候都是由父類去定義,然后子類去實現(xiàn)即可
缺點
雖然我們把一些類的共同操作封裝起來,但是當(dāng)這些類比較多時,效果就不會很好,會多很多類,提高編譯效率,提升內(nèi)存開銷