1. 程式人生 > >java 工廠+策略+模板方法模式實現單介面多種型別檔案解析

java 工廠+策略+模板方法模式實現單介面多種型別檔案解析

一、引言

        做檔案上傳解析時,一個上傳入口往往會上傳多種型別的待解析檔案或者上傳的壓縮包包含多種型別待解析檔案,或者多個上傳入口呼叫後臺同一個介面。本文基於這樣的場景,在滿足多用組合、少用繼承的原則下,設計了工廠+策略+模板方法設計模式實現業務需求。具體實現如下:

二、業務介面

package com.test.oneFactoryAndStrategySystem;

/**
 * @author admin
 * 解析檔案呼叫介面
 */
public interface IService
{
	/**
	 * <解析檔案呼叫介面>
	 * @param inPutPath
	 * @param outPathPath
	 * @param typeId
	 * @return
	 */
	String parse(String inPutPath,String outPathPath,int typeId);
}

三、業務介面實現類

package com.test.oneFactoryAndStrategySystem.Impl;

import com.test.oneFactoryAndStrategySystem.IService;
import com.test.oneFactoryAndStrategySystem.factory.AnalysisStrateGyFactory;
import com.test.oneFactoryAndStrategySystem.strategy.AbstractStrategyTemplate;

/**
 * @author admin
 *
 */
public class SomeService implements IService
{
	/*
	 * 解析介面實現方法
	 */
	@Override
	public String parse(String inPutPath, String outPathPath, int typeId)
	{
		AbstractStrategyTemplate handle = AnalysisStrateGyFactory.buildStratey(inPutPath, outPathPath, typeId);
		long successNum = handle.analysis();
		String message = "成功解析" + successNum + "條資料";
		return message;
	}

}

四、選擇策略工廠

package com.test.oneFactoryAndStrategySystem.factory;

import com.test.oneFactoryAndStrategySystem.strategy.AbstractStrategyTemplate;
import com.test.oneFactoryAndStrategySystem.strategy.CSVAnalysisHandle;
import com.test.oneFactoryAndStrategySystem.strategy.ExcelAnalysisHandle;
import com.test.oneFactoryAndStrategySystem.strategy.XMLAnalysisHandle;

/**
 * @author admin
 * 選擇策略工廠
 */
public class AnalysisStrateGyFactory
{
	public static AbstractStrategyTemplate buildStratey(String inPutPath, String outPathPath, int typeId)
	{
		AbstractStrategyTemplate handle = null;
		//根據需要檔案typeId選擇具體策略
		switch(typeId)
		{
			case 101:
				//解析CSV檔案
				handle = new CSVAnalysisHandle(inPutPath, outPathPath, typeId);
				break;
			case 102:
				//解析Excel檔案
				handle = new ExcelAnalysisHandle(inPutPath, outPathPath, typeId);
				break;
			case 103:
				//解析XML檔案
				handle = new XMLAnalysisHandle(inPutPath, outPathPath, typeId);
				break;
		}
		return handle;
	}
}

五、模板方法

package com.test.oneFactoryAndStrategySystem.strategy;

/**
 * @author admin
 * 模板方法
 */
public abstract class AbstractStrategyTemplate
{
	/**
	 * 檔案型別是否正確
	 */
	public final boolean checkFileType(String inputPath,String suffix)
	{
		if(inputPath.endsWith(suffix))
		{
			return true;
		}
		return false;
	}
	
	/**
	 * 檔案解析主方法
	 */
	public abstract long analysis();
	
	/**
	 * 鉤子方法,子類可重寫
	 */
	public void writeFile(String outPathPath)
	{
		System.out.println("預設寫出CSV檔案");
	}
}

六、策略一

package com.test.oneFactoryAndStrategySystem.strategy;

import org.apache.log4j.Logger;

/**
 * @author admin
 * 解析CSV型別檔案handle
 *
 */
public class CSVAnalysisHandle extends AbstractStrategyTemplate
{
	private static Logger logger = Logger.getLogger(CSVAnalysisHandle.class);
	/**
	 * 檔案輸入路徑
	 */
	private String inPutPath;
	
	/**
	 * 檔案輸出路徑
	 */
	private String outPathPath;
	
	/**
	 * 檔案型別
	 */
	private int typeId;
	
	public CSVAnalysisHandle()
	{
	}

	public CSVAnalysisHandle(String inPutPath, String outPathPath, int typeId)
	{
		super();
		this.inPutPath = inPutPath;
		this.outPathPath = outPathPath;
		this.typeId = typeId;
	}

	@Override
	public long analysis()
	{
		//成功解析條數計數
		long successNum = 0;
		//判斷是否為需要解析的檔案
		//檔案型別正確,並且typeId正確
		if(checkFileType(inPutPath, ".csv") && typeId == 101)
		{
			System.out.println("解析"+ typeId + "型別的CSV檔案,並返回成功解析條數");
			//成功解析10條檔案
			successNum = 10;
			//使用預設寫出方法,寫出CSV檔案
			writeFile(outPathPath);
		}
		else
		{
			logger.error("file type is error");
			return 0;
		}
		return successNum;
	}

}

七、策略2

package com.test.oneFactoryAndStrategySystem.strategy;

import org.apache.log4j.Logger;

/**
 * @author admin
 * 解析Excel型別檔案handle
 *
 */
public class ExcelAnalysisHandle extends AbstractStrategyTemplate
{
	private static Logger logger = Logger.getLogger(ExcelAnalysisHandle.class);
	/**
	 * 檔案輸入路徑
	 */
	private String inPutPath;
	
	/**
	 * 檔案輸出路徑
	 */
	private String outPathPath;
	
	/**
	 * 檔案型別
	 */
	private int typeId;
	
	public ExcelAnalysisHandle()
	{
	}

	public ExcelAnalysisHandle(String inPutPath, String outPathPath, int typeId)
	{
		super();
		this.inPutPath = inPutPath;
		this.outPathPath = outPathPath;
		this.typeId = typeId;
	}

	@Override
	public long analysis()
	{
		//成功解析條數計數
		long successNum = 0;
		//判斷是否為需要解析的檔案
		//檔案型別正確,並且typeId正確
		if(checkFileType(inPutPath, ".xlsx") && typeId == 102)
		{
			System.out.println("解析"+ typeId + "型別的xml檔案,並返回成功解析條數");
			//成功解析10條檔案
			successNum = 10;
			//使用預設寫出方法,寫出xml檔案
			writeFile(outPathPath);
		}
		else
		{
			logger.error("file type is error");
			return 0;
		}
		return successNum;
	
	}

}

八、策略3

package com.test.oneFactoryAndStrategySystem.strategy;

import org.apache.log4j.Logger;

/**
 * @author admin
 * 解析XML型別檔案handle
 *
 */
public class XMLAnalysisHandle extends AbstractStrategyTemplate
{
	private static Logger logger = Logger.getLogger(ExcelAnalysisHandle.class);
	/**
	 * 檔案輸入路徑
	 */
	private String inPutPath;
	
	/**
	 * 檔案輸出路徑
	 */
	private String outPathPath;
	
	/**
	 * 檔案型別
	 */
	private int typeId;
	
	public XMLAnalysisHandle()
	{
	}

	public XMLAnalysisHandle(String inPutPath, String outPathPath, int typeId)
	{
		super();
		this.inPutPath = inPutPath;
		this.outPathPath = outPathPath;
		this.typeId = typeId;
	}

	@Override
	public long analysis()
	{

		//成功解析條數計數
		long successNum = 0;
		//判斷是否為需要解析的檔案
		//檔案型別正確,並且typeId正確
		if(checkFileType(inPutPath, ".xml") && typeId == 103)
		{
			System.out.println("解析"+ typeId + "型別的xml檔案,並返回成功解析條數");
			//成功解析10條檔案
			successNum = 10;
			//使用預設寫出方法,寫出xml檔案
			writeFile(outPathPath);
		}
		else
		{
			logger.error("file type is error");
			return 0;
		}
		return successNum;
	}
	
	/*
	 * 重寫鉤子方法,寫出Excel檔案
	 */
	@Override
	public void writeFile(String outPathPath)
	{
		System.out.println("寫出Excel檔案");
	}
}

九、Test

package com.test.oneFactoryAndStrategySystem.test;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.test.oneFactoryAndStrategySystem.IService;
import com.test.oneFactoryAndStrategySystem.Impl.SomeService;

/**
 * @author admin
 * 測試類
 *
 */
public class MyTest
{
	/**
	 * 解析呼叫
	 */
	private IService service;
	
	/**
	 * 檔案輸入路徑
	 */
	private String inPutPath;
	
	/**
	 * 檔案輸出路徑
	 */
	private String outPathPath;
	
	/**
	 * 檔案型別
	 */
	private int typeId;
	
	/**
	 * 解析完成返回值
	 */
	private String message;
	
	@Before
	public void before()
	{
		service = new SomeService();
	} 
	
	@After
	public void after()
	{
		//控制檯資料返回訊息
		System.out.println(message);
	}
	
	/**
	 * 解析CSV檔案測試類
	 */
	@Test
	public void CSVAnalysisTest()
	{
		inPutPath = "C:\\Users\\test\\Desktop\\1.csv";
		outPathPath = "C:\\Users\\test\\Desktop\\1\\";
		typeId = 101;
		message = service.parse(inPutPath, outPathPath, typeId);
	}
	
	/**
	 * 解析Excel檔案測試類
	 */
	@Test
	public void ExcelAnalysisTest()
	{
		inPutPath = "C:\\Users\\test\\Desktop\\1.xlsx";
		outPathPath = "C:\\Users\\test\\Desktop\\1\\";
		typeId = 102;
		message = service.parse(inPutPath, outPathPath, typeId);
	}
	
	/**
	 * 解析XML檔案測試類
	 */
	@Test
	public void XMLAnalysisTest()
	{
		inPutPath = "C:\\Users\\test\\Desktop\\1.xml";
		outPathPath = "C:\\Users\\test\\Desktop\\1\\";
		typeId = 103;
		message = service.parse(inPutPath, outPathPath, typeId);
	}
}

十、結果

解析103型別的xml檔案,並返回成功解析條數
寫出Excel檔案
成功解析10條資料

解析101型別的CSV檔案,並返回成功解析條數
預設寫出CSV檔案
成功解析10條資料
解析102型別的xml檔案,並返回成功解析條數
預設寫出CSV檔案
成功解析10條資料
Copyright ©2018 hbgengfei11

相關推薦

java 工廠+策略+模板方法模式實現介面多種型別檔案解析

一、引言        做檔案上傳解析時,一個上傳入口往往會上傳多種型別的待解析檔案或者上傳的壓縮包包含多種型別待解析檔案,或者多個上傳入口呼叫後臺同一個介面。本文基於這樣的場景,在滿足多用組合、少用繼承的原則下,設計了工廠+策略+模板方法設計模式實現業務需求。具體實現如下:

Java學習之模板方法模式

1.2 模板方法模式 父類中,建立了幾個方法,而且指定了做一件事情,需要使用那幾個方法,這些方法的先後順序也已經指定了。 模板方法是程式設計中經常要用到的模式。它定義了一個操作周哦你那個的演算法的骨架,將某些步驟延遲到子類中實現。這樣,子類可以咋不改變演算法的結構下重新定義該演算法的特定步驟

設計模式簡單介紹(java語言)-- 模板方法模式

設計模式簡單介紹(java語言)– 模板方法模式 模板方法模式的定義 模板方法模式:定義一個操作中的演算法的框架,而將一些步驟延遲到子類中。使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。 類圖: 類圖中,Abstrac

模板方法模式 + 觀察者模式 + 簡單工廠模式 + 模式實現一個簡單的數據表讀寫

private 數據庫鏈 obs imp 通知 model 數據表 ring pri 實現功能: 對數據表的讀要緩存起來,對數據表的寫需要清除緩存. 數據表根據屬性字段來決定是否緩存 可以更換數據庫鏈接方式,比如可以隨時更換為mysql或mysqli() 當插入數據時給出一

Java進階篇設計模式之十一 ---- 策略模式模板方法模式

前言 在上一篇中我們學習了行為型模式的訪問者模式(Visitor Pattern)和中介者模式(Mediator Pattern)。本篇則來學習下行為型模式的兩個模式,策略模式(Strategy Pattern)和模板模式(Mediator Pattern)。 策略模式 簡介 策略模式(Stra

Java中常見的設計模式---簡單工廠模式工廠方法模式模式

在講設計模式之前,我們首先來說一下面向物件思想的設計原則,在實際的開發中,我們要想更深入的瞭解面向物件思想,就必須熟悉前人總結過的面向物件的思想的設計原則:1.單一職責原則:“高內聚,低耦合”,也就是說,每個類應該只有一個職責,對外只能提供一種功能,而引起類變化的原因應該只有

模式工廠模式、抽象模式模板方法模式

一:單例模式 1.定義:單例模式確保某一個類智慧建立一個物件。 2.單例模式的實現主要是把構造器設定為private,外部通過Singleton.getInstance()來訪問。通用類圖: 3.單例模式實現的三種方式: (1)立即載入/餓漢模式,即在呼叫方法前,例項已經

代理模式,簡單(靜態)工廠模式模式模板方法模式個人理解

簡言: java中總共有23種設計模式,每個模式的出現都是為了解決某一方面的問題,所以這23種設計模式有他們各自適用的地方(廢話有點多),而設計模式的產生主要是為了降低類與類之間的耦合度。下面我們就簡單的瞭解一下幾種設計模式及使用的地方。 1.單例模式:

java設計模式之——策略模式模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、直譯器模式(行為型)【讀書筆記】

一、策略模式           定義:定義了演算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化,不會影響到演算法的客戶。           使用場景:策略模式是一種定義一系列演算法的方法,從概念上看,所有的這些演算法完成的都是相同的工作,只是實現不

java中的工廠方法模式(先把模板方法模式看透)

public class DatabaseFactory extends Factory { private Database database; @Override public Database createDatabase(String databasetype) {

Java設計模式之十一 ---- 策略模式模板方法模式

得到 ref images 幾種算法 www. lse -type 中介者模式 vat 前言 在上一篇中我們學習了行為型模式的訪問者模式(Visitor Pattern)和中介者模式(Mediator Pattern)。本篇則來學習下行為型模式的兩個模式,策略模式(Stra

Java學習筆記——設計模式之七.模板方法模式

tro mage emp java學習 java學習筆記 trac 子類 技術 primitive 模板方法模式(TemplateMethod),定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。

模板方法模式(think in java中的設計模式

方法 bst pac code pri ack 單點 size clas 模板方法模式:模板方法模式顧名思義就是一種構造模塊化的設計模式。將一次行為分為多種行為,靈活的調用不同模塊進行工作。比如在飯店吃飯,分為:點菜,吃飯,買單等行為無論什麽飯店大致都是這三種行為。因此我們

java設計模式----模板方法模式

抽象類 子類 底層 代碼 做事 方法 模板 期待 代碼復用 模板方法模式:   在一個方法中定義一個算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變算法結構的情況下,重新定義算法中的某些實現。 好萊塢原則:   別調用(打電話給)我們,我們會調用(打電話給

java設計模式模板方法模式

java 設計模式宋丹丹姐的一個小品,說把大象放入冰箱分為幾步驟,三步、第一步:把冰箱門打開,第二步:把大象裝進去,第三步:把冰箱門關上。就是這樣的一個小品,可以說是其實簡化的一個模板方法。把雞蛋裝進冰箱分為幾步,同樣也是這個道理。模板方法模式概念:把一些共同的行為抽象出來,作為父類公共使用,一些具體的步驟

JAVA模式》之模板方法模式

cal php pri jsm vsm uft tmp throw tox 模板方法模式是類的行為模式。準備一個抽象類,將部分邏輯以具體方法以及具體構造函數的形式實現,然後聲明一些抽象方法來迫使子類實現剩余的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩余的邏輯

java回調方法、鉤子方法以及模板方法模式

style 調用 rri itl 回調方法 技術 owa 我們 col 在面向對象的語言中,回調則是通過接口或抽象類來實現的,我們把實現這種接口的類稱為回調類,回調類的對象稱為回調對象,其處理事件的方法叫做回調方法。(摘自百度百科) 那麽通過上面那句話將百度百科中的“回調函

模板方法模式&策略模式區別聯系

支持 余額 rri get system 流程 lda public () 一、模板方法 模板方法模式:定義 一系列算法, 子類延伸實現。著重點在於:子類去處理不同的方法實現。 看下面例子。 假如一個支付 都包含三個部分: 生成訂單 ----》調用API發起支付----

JAVA設計模式模板方法模式和建造者模式

一、前期回顧 上一篇《Java 設計模式之工廠方法模式與抽象工廠模式》介紹了三種工廠模式,分別是工廠方法模式,簡單工廠方法模式,抽象工廠模式,文中詳細根據實際場景介紹了三種模式的定義,實踐,最後總結了三種方式的區別,以及各個模式的適用場景。這一篇博文我們來學習下模板方法模式和建造者模式。

Java設計模式 - 模板方法模式

Java設計模式 - 模板方法模式 定義一個演算法的骨架,並將一些步驟通過子類表達。   UML圖示 要點 1. 定義一個演算法的骨架 - 建立一個抽象類 2. 將一些步驟通過子類表達 - 子類繼承抽象類 賦予不同實現   模板方法應用例項 模板方法