什么是模板方法設(shè)計(jì)模式?
模板方法設(shè)計(jì)模式是一種行為型設(shè)計(jì)模式,它定義了一個(gè)算法的骨架,并將一些步驟的具體實(shí)現(xiàn)延遲到子類中。模板方法模式可以幫助確保在算法的不同部分中保持一致性,同時(shí)也允許子類根據(jù)需要進(jìn)行具體實(shí)現(xiàn)。
模板方法模式的關(guān)鍵特點(diǎn)包括:
- 抽象類: 定義一個(gè)抽象類,其中包含一個(gè)模板方法,該方法定義了算法的骨架。這個(gè)抽象類可以包含一些通用的實(shí)現(xiàn)或共享的代碼。
- 具體步驟: 在抽象類中,將算法的不同步驟定義為抽象方法。這些步驟需要由具體的子類來(lái)實(shí)現(xiàn)。
- 模板方法: 這是算法的核心方法,它包含了算法的基本步驟,可能包括調(diào)用不同的具體步驟方法。這個(gè)方法通常是 final,以防止子類修改整體算法結(jié)構(gòu)。
- 鉤子方法:鉤子方法是一種在抽象類中定義的方法,子類可以選擇是否覆蓋它。這些方法通常是空方法,可以在模板方法的執(zhí)行過(guò)程中被調(diào)用,以便影響算法的某些特定步驟。
模板方法設(shè)計(jì)模式的優(yōu)點(diǎn)包括:
- 提供了一種統(tǒng)一的算法結(jié)構(gòu),使得算法在不同的子類中保持一致。
- 提供了代碼復(fù)用和共享的機(jī)制,避免了重復(fù)的代碼。
- 允許子類根據(jù)需要覆蓋特定步驟的實(shí)現(xiàn),實(shí)現(xiàn)了開(kāi)閉原則。
一個(gè)典型的模板方法設(shè)計(jì)模式的例子是 Java 中的 AbstractList 類,它定義了訪問(wèn)和修改列表的算法框架,然后由具體的子類(如 ArrayList、LinkedList 等)實(shí)現(xiàn)不同的細(xì)節(jié)。
總之,模板方法設(shè)計(jì)模式允許您定義一個(gè)算法的骨架,然后將一些具體的步驟延遲到子類中實(shí)現(xiàn)。這種方式提高了代碼的復(fù)用性和可維護(hù)性,同時(shí)也確保了算法的一致性。
模板抽象類
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* @author Wang
*/
@Slf4j
public abstract class AbstractSynFileHandler<T> implements InitializingBean {
/**
* parseFile
* @param inputStream inputStream
* @return <T> List<T>
* @throws IOException IOException
*/
public abstract List<T> parseFile(InputStream inputStream) throws IOException;
/**
* getHandlerName
* @return String
*/
public abstract String getFileName();
@Override
public void afterPropertiesSet(){
SynFileFactory.registerHandler(getFileName(), this);
}
}
在這個(gè)代碼片段中,AbstractSynFileHandler 是一個(gè)抽象類,定義了一個(gè)模板方法模式的結(jié)構(gòu)。模板方法模式的關(guān)鍵是抽象類中的模板方法,該方法定義了一個(gè)算法的基本步驟,但是某些步驟的具體實(shí)現(xiàn)留給了子類來(lái)完成。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-655070.html
在這個(gè)代碼中,parseFile 和 getFileName方法是需要子類實(shí)現(xiàn)的具體步驟。這些步驟的具體實(shí)現(xiàn)因應(yīng)用而異,所以它們被定義為抽象方法。然后,在 afterPropertiesSet方法中,SynFileFactory.registerHandler 方法被調(diào)用,該方法將當(dāng)前實(shí)例注冊(cè)到 SynFileFactory中,實(shí)現(xiàn)了模板方法模式中的模板方法調(diào)用和延遲到子類的具體實(shí)現(xiàn)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-655070.html
子類實(shí)現(xiàn)
import cn.hutool.core.text.CharSequenceUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
/**
* @author Wang
*/
@RequiredArgsConstructor
@Slf4j
@Component
public class AccountHandler extends AbstractSynFileHandler<AccountEntity> {
@Override
public List<AccountEntity> parseFile(InputStream inputStream) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
List<AccountEntity> list = new ArrayList<>();
String line;
int lineNum = 0;
while ((line = reader.readLine()) != null) {
if (lineNum == 0) {
lineNum++;
continue;
}
String[] values = line.split(Cons.Delimiter.WAVY);
AccountEntity accountEntity = new AccountEntity();
this.buildEntity(values, accountEntity);
list.add(accountEntity);
lineNum++;
}
return list;
}
private void buildEntity(String[] values, AccountEntity accountEntity) {
if(CharSequenceUtil.isNotBlank(values[0])){
accountEntity.setSiebelId(values[0]);
}
if(CharSequenceUtil.isNotBlank(values[1])){
accountEntity.setFirstName(values[1]);
}
if(CharSequenceUtil.isNotBlank(values[2])){
accountEntity.setLastName(values[2]);
}
if(CharSequenceUtil.isNotBlank(values[3])){
accountEntity.setMiddleInitial(values[3]);
}
if(CharSequenceUtil.isNotBlank(values[4])){
accountEntity.setEmail(values[4]);
}
if(CharSequenceUtil.isNotBlank(values[5])){
accountEntity.setCellPhone(values[5]);
}
if(CharSequenceUtil.isNotBlank(values[6])){
accountEntity.setAddress1(values[6]);
}
if(CharSequenceUtil.isNotBlank(values[7])){
accountEntity.setAddress2(values[7]);
}
if(CharSequenceUtil.isNotBlank(values[8])){
accountEntity.setCity(values[8]);
}
if(CharSequenceUtil.isNotBlank(values[9])){
accountEntity.setState(values[9]);
}
if(CharSequenceUtil.isNotBlank(values[10])){
accountEntity.setZip(values[10]);
}
}
@Override
public String getFileName() {
return SiebelCons.ACCOUNT;
}
}
到了這里,關(guān)于Java設(shè)計(jì)模式 (一) 模板方法設(shè)計(jì)模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!