有人說講講設(shè)計(jì)模式匈辱,自己掌握的也不是很好缔刹,有些概念我給大家背背書球涛,說說自己的理解,和大家一起學(xué)習(xí)一下吧校镐。
模板模式
背書中:模板方法模式亿扁,定義一個(gè)操作流程框架,將中間一些步驟放到子類實(shí)現(xiàn)鸟廓。
書背完了从祝,先舉個(gè)栗子吧,再來說說自己的理解引谜。
先舉個(gè)栗子
高考剛過去1個(gè)月吧牍陌,就拿高考閱卷說吧(栗子,并不真實(shí))员咽,假設(shè)現(xiàn)在寫個(gè)程序閱卷程序毒涧,對(duì)于理綜卷來說,科目分為物理贝室、化學(xué)链嘀、生物,題型有選擇題档玻、填空題怀泊、解答題(假設(shè)的),閱卷的流程我們分成核對(duì)選擇误趴、核對(duì)填空霹琼、核對(duì)解答三個(gè)步驟,對(duì)于填空來說凉当,每個(gè)空填固定的答案枣申,我們假設(shè)核對(duì)標(biāo)準(zhǔn)是一樣的,對(duì)于選擇看杭,物理是不定項(xiàng)選擇忠藤,化學(xué)是單項(xiàng)選擇(至少我們那時(shí)候高考是這樣的,現(xiàn)在不知道)楼雹,所以說對(duì)于選擇模孩、解答尖阔,三個(gè)科目的核對(duì)標(biāo)準(zhǔn)應(yīng)該是不一樣的,按照這個(gè)假設(shè)榨咐,我們來寫寫代碼:
package edu.design.pattern;
/**
* @Description: .
* @Author: ZhaoWeiNan .
* @CreatedTime: 2017/7/14 .
* @Version: 1.0 .
*/
public class TemplateMethodDemo {
public static void main(String[] args){
//化學(xué)科目
Examination chemistryExamination = new ChemistryExamination("化學(xué)");
//物理科目
Examination physicsExamination = new PhysicsExamination("物理");
//化學(xué)閱卷
chemistryExamination.mark();
//物理閱卷
physicsExamination.mark();
}
}
abstract class Examination{
//科目
private String subject;
public Examination(String subject) {
this.subject = subject;
}
//定義一個(gè)閱卷流程 對(duì)試卷打分
public void mark(){
//計(jì)算三個(gè)題型的得分介却,得出總分
int choice = markChoice();
int blank = markBlank();
int answer = markAnswer();
System.out.println("這個(gè)考生" + subject + "選擇題得分為:" + choice);
System.out.println("這個(gè)考生" + subject + "填空題得分為:" + blank);
System.out.println("這個(gè)考生" + subject + "解答題得分為:" + answer);
System.out.println("這個(gè)考生" + subject + "總得分為:" + (choice + blank + answer));
}
//核對(duì)選擇題,因?yàn)槲锢砜樽隆⒒瘜W(xué)齿坷、生物的核對(duì)標(biāo)準(zhǔn)不一樣,放到子類中去實(shí)現(xiàn)
public abstract int markChoice();
//核對(duì)填空題
public int markBlank(){
//模擬填空打分数焊,因?yàn)樘羁蘸藢?duì)標(biāo)準(zhǔn)都一樣永淌,放到父類中實(shí)現(xiàn)
return 10;
}
//核對(duì)解答題,因?yàn)槲锢砼宥⒒瘜W(xué)遂蛀、生物的核對(duì)標(biāo)準(zhǔn)不一樣,放到子類中去實(shí)現(xiàn)
public abstract int markAnswer();
}
class ChemistryExamination extends Examination{
public ChemistryExamination(String subject) {
super(subject);
}
//核對(duì)化學(xué)選擇題的方法
@Override
public int markChoice() {
//假設(shè)有個(gè)專門針對(duì)化學(xué)選擇題很復(fù)雜的算法
return 20;
}
//核對(duì)化學(xué)解答題的方法
@Override
public int markAnswer() {
//假設(shè)有個(gè)專門針對(duì)化學(xué)解答題很復(fù)雜的算法
return 25;
}
}
class PhysicsExamination extends Examination{
public PhysicsExamination(String subject) {
super(subject);
}
//核對(duì)物理選擇題的方法
@Override
public int markChoice() {
//假設(shè)有個(gè)專門針對(duì)物理選擇題很復(fù)雜的算法
return 10;
}
//核對(duì)物理解答題的方法
@Override
public int markAnswer() {
//假設(shè)有個(gè)專門針對(duì)物理解答題很復(fù)雜的算法
return 15;
}
}
栗子完了蚕愤,總結(jié)下,個(gè)人理解饺蚊,模板方法模式是把一些共用的方法放到父類中萍诱,一些不共用的方法,放到子類中去實(shí)現(xiàn)污呼, 去除一些子類中的重復(fù)代碼裕坊,很好的體現(xiàn)出了代碼的復(fù)用性。
TemplateMethod模板方法模式就為大家說到這里燕酷,歡迎大家來交流籍凝,指出文中一些說錯(cuò)的地方,讓我加深認(rèn)識(shí)苗缩。
謝謝大家饵蒂!