1??概念
定義:定義了一個算法的骨架,并允許子類為一個或多個步驟提供實現(xiàn);
補充:模板方法使得子類可以在不改變算法結(jié)構(gòu)的情況下,重新定義算法的某些步驟;
類型:行為型
2??適用場景
一次性實現(xiàn)一個算法的不變的部分,并將可變的行為留給子類來實現(xiàn);
各子類中公共的行為被提取出來并集中到一個公共父類中,從而避免代碼重復(fù);
3??優(yōu)點
提高復(fù)用性;
提高擴展性;
符合開閉原則;
4??缺點
類數(shù)目的增加;
增加了系統(tǒng)實現(xiàn)的復(fù)雜度;
繼承關(guān)系自身的缺點,如果父類添加新的抽象方法,所有子類都需要改一遍;
5??模板方法Coding
①創(chuàng)建ACourse抽象類
public abstract class ACourse {
protected final void makeCourse(){
this.makePPT();
this.makeVideo();
if(needWriteArticle()){
this.writeArticle();
}
this.packageCourse();
}
final void makePPT(){
System.out.println("制作PPT");
}
final void makeVideo(){
System.out.println("制作視頻");
}
final void writeArticle(){
System.out.println("編寫手記");
}
//鉤子方法
protected boolean needWriteArticle(){
return false;
}
abstract void packageCourse();
}
②創(chuàng)建DesignPatternCourse類繼承ACourse
public class DesignPatternCourse extends ACourse {
@Override
void packageCourse() {
System.out.println("提供課程Java源代碼");
}
@Override
protected boolean needWriteArticle() {
return true;
}
}
③創(chuàng)建FECourse類繼承ACourse
public class FECourse extends ACourse {
private boolean needWriteArticleFlag = false;
@Override
void packageCourse() {
System.out.println("提供課程的前端代碼");
System.out.println("提供課程的圖片等多媒體素材");
}
public FECourse(boolean needWriteArticleFlag) {
this.needWriteArticleFlag = needWriteArticleFlag;
}
@Override
protected boolean needWriteArticle() {
return this.needWriteArticleFlag;
}
}
④UML類圖
⑤編寫測試類
public class Test {
public static void main(String[] args) {
// System.out.println("后端設(shè)計模式課程start---");
// ACourse designPatternCourse = new DesignPatternCourse();
// designPatternCourse.makeCourse();
// System.out.println("后端設(shè)計模式課程end---");
System.out.println("前端課程start---");
ACourse feCourse = new FECourse(false);
feCourse.makeCourse();
System.out.println("前端課程end---");
}
}
6??迭代器模式的實際使用
HttpServlet.doGet方法