行为型设计模式:模板模式
生活随笔
收集整理的這篇文章主要介紹了
行为型设计模式:模板模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
模板模式是常用的一種行為型設計模式,主要思想是在模板中定義一套流程骨架代碼,并且不實現骨架代碼中使用的一些方法,這些方法留給子類去實現。假如我們業務開發中有一個場景,我們的業務系統需要從不同征信渠道查詢征信報告,每家機構輸出的內容不一樣,但是都分為3個步驟,建立連接、獲取報告原始內容、解析報告并入庫。這樣,我們定義一個模板類:
public abstract class AbstractReportTemplate {? protected Logger logger = LoggerFactory.getLogger(getClass());? public final void doTask(){ doConnect(); getReport(); parseRepot(); }? /** * 建立連接 */ public abstract void doConnect();? /** * 獲取報告 */ public abstract void getReport();? /** * 解析報告并落庫 */ public abstract void parseRepot();}?假如我們現在要對接A征信機構,那我們只要繼承這個模板類,實現上面的抽象方法就可以了,任務流程不變。
public class AReport extends AbstractReportTemplate {? public void doConnect() { logger.info("do connect"); }? public void getReport() { logger.info("get report"); }? public void parseRepot() { logger.info("parseReport"); }}方法調用:
public static void main(String[] args){ AbstractReportTemplate aReport = new AReport(); aReport.doTask(); }可見,模板模式實現起來非常簡單。下面我介紹幾個源碼中的模板模式。
1.jdk中的InputStream類就是一個模板類,里面定義了抽象read方法
public int read(byte b[], int off, int len) throws IOException { if (b == null) { throw new NullPointerException(); } else if (off < 0 || len < 0 || len > b.length - off) { throw new IndexOutOfBoundsException(); } else if (len == 0) { return 0; }? int c = read(); if (c == -1) { return -1; } b[off] = (byte)c;? int i = 1; try { for (; i < len ; i++) { c = read(); if (c == -1) { break; } b[off + i] = (byte)c; } } catch (IOException ee) { } return i; } public abstract int read() throws IOException;實現類有好多,如下圖:
下面是ByteArrayInputStream的實現:
public synchronized int read() { return (pos < count) ? (buf[pos++] & 0xff) : -1; }2.jdbc中的AbstractDataSourceInitializer用來初始化數據源
@PostConstruct protected void initialize() { if (!isEnabled()) { return; } ResourceDatabasePopulator populator = new ResourceDatabasePopulator(); String schemaLocation = getSchemaLocation(); if (schemaLocation.contains(PLATFORM_PLACEHOLDER)) { String platform = getDatabaseName(); schemaLocation = schemaLocation.replace(PLATFORM_PLACEHOLDER, platform); } populator.addScript(this.resourceLoader.getResource(schemaLocation)); populator.setContinueOnError(true); customize(populator); DatabasePopulatorUtils.execute(populator, this.dataSource); } protected abstract DataSourceInitializationMode getMode();? protected abstract String getSchemaLocation();BatchDataSourceInitializer中的實現
@Override protected DataSourceInitializationMode getMode() { return this.properties.getInitializeSchema(); }? @Override protected String getSchemaLocation() { return this.properties.getSchema(); }文中源碼:https://github.com/jinjunzhu/design-pattern.git
微信公眾號,歡迎關注,一起學習成長
總結
以上是生活随笔為你收集整理的行为型设计模式:模板模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米Miui线刷步骤记录
- 下一篇: 批量导入手机通讯录_大批量手机号导入通讯