您的位置:首页 > 编程语言 > PHP开发

引入模板模式重构FtpClientUtil

2015-01-22 21:04 197 查看
《ftp上传与下载》文章中,封装一个Ftp上传下载的工具类,主要代码如下:

上传:

/**上传文件
	 * @param remoteFileName 远程文件名称
	 * @param locaFileName 本地文件名称
	 */
	public void upload(String remoteFileName,String locaFileName){
		FTPClient ftp=null; 
		try {
			ftp = new FTPClient();
			ftp.addProtocolCommandListener( new PrintCommandListener( new PrintWriter( System.out ), true ) );
			//连接ftp服务器
			connect( ftp );
			//设置属性
			setProperty( ftp );
			//上传文件
			upload( ftp, remoteFileName, locaFileName );
			//退出
			logout( ftp );
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			if (ftp.isConnected()) {
				try {
					ftp.disconnect();
				} catch (IOException f) {
				}
			}
		}
		
	}


下载:

/**下载文件
	 * @param remoteFileName 远程文件名称
	 * @param locaFileName 本地文件名称
	 */
	public void download(String remoteFileName,String locaFileName){
		FTPClient ftp=null; 
		try {
			ftp = new FTPClient();
			ftp.addProtocolCommandListener( new PrintCommandListener( new PrintWriter( System.out ), true ) );
			//连接ftp服务器
			connect( ftp );
			//设置属性
			setProperty( ftp );
			//下载文件
			download( ftp, remoteFileName, locaFileName );
			//退出
			logout( ftp );
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			if (ftp.isConnected()) {
				try {
					ftp.disconnect();
				} catch (IOException f) {
				}
			}
		}
	}


从上面两个方法来看,我们发现upload()与download()方法的,有公共的操作流程:

connect()

setProperty()

具体操作方法

logout( )

这时,可以使用模板模式对它进行重构,不了解模板模式的朋友,可以参考《行为模式之Template(模板模式)》

定义一个模板方法,来完成操作流程的调用,在上篇模版模式当中,是以继承的方式,由子类来实现具体的操作方法,

这次将以聚合的方式实现.

首先,将具体操作方法定义在接口中,接口定义如下:

FtpInvoke

package com.demo.ftp;

import org.apache.commons.net.ftp.FTPClient;

/**ftp操作
 * @author wobendiankun
 *2015-1-22 下午08:27:12
 */
public interface FtpInvoke {
	/**
	 * @param ftp
	 * @param remoteFileName
	 * @param locaFileName
	 */
	void doHandle(FTPClient ftp ,String remoteFileName, String locaFileName) throws Exception;
}


其次,引入一个新的模版类,名为FtpTemplate,定义一个模板方法handle(),如下:

private void handle(FtpInvoke ftpInvoke, String remoteFileName,
			String locaFileName) {
		FTPClient ftp = null;
		try {
			ftp = new FTPClient();
			ftp.addProtocolCommandListener(new PrintCommandListener(
					new PrintWriter(System.out), true));
			// 连接ftp服务器
			connect(ftp);
			// 设置属性
			setProperty(ftp);
			// 具体操作方法
			ftpInvoke.doHandle(ftp, remoteFileName, locaFileName);
			// 退出
			logout(ftp);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (ftp.isConnected()) {
				try {
					ftp.disconnect();
				} catch (IOException f) {
				}
			}
		}
	}


接着,修改相关的操作方法,upload()及download()方法,利用一个匿名类,让handle()方法来回调

/**
	 * 上传文件
	 * 
	 * @param remoteFileName
	 *            远程文件名称
	 * @param locaFileName
	 *            本地文件名称
	 */
	public void upload(String remoteFileName, String locaFileName) {
		handle(new FtpInvoke() {

			@Override
			public void doHandle(FTPClient ftp, String remoteFileName,
					String locaFileName) throws Exception {
				//上传文件
				upload( ftp, remoteFileName, locaFileName );
			}
		}, remoteFileName, locaFileName);

	}


/**
	 * 下载文件
	 * 
	 * @param remoteFileName
	 *            远程文件名称
	 * @param locaFileName
	 *            本地文件名称
	 */
	public void download(String remoteFileName, String locaFileName) {
		handle(new FtpInvoke() {

			@Override
			public void doHandle(FTPClient ftp, String remoteFileName,
					String locaFileName) throws Exception {
				// 下载文件
				download(ftp, remoteFileName, locaFileName);
			}
		}, remoteFileName, locaFileName);
	}


最后要让FtpClientUtil聚合FtpTemplate,然后将对应的请求委托给FtpTemplate来处理就可以了,大功告成.

package com.demo.ftp;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ConnectException;

import org.apache.commons.net.PrintCommandListener;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

/**
 * @author wobendiankun 2015-1-8 下午08:11:08
 */
public class FtpClientUtil {
	FtpTemplate fpFtpTemplate ;
	
	public FtpClientUtil () {
		String server = "localhost";
		int port = 21;
		String username = "kun";
		String password = "111111";
		fpFtpTemplate = new FtpTemplate(server, port, username, password);
	}
	
	public FtpClientUtil(String server, int port, String username,
			String password) {
		fpFtpTemplate = new FtpTemplate(server, port, username, password);
	}
	/**上传文件
	 * @param remoteFileName 远程文件名称
	 * @param locaFileName 本地文件名称
	 */
	public void upload(String remoteFileName,String locaFileName){
		fpFtpTemplate.upload(remoteFileName, locaFileName);
	}
	/**下载文件
	 * @param remoteFileName 远程文件名称
	 * @param locaFileName 本地文件名称
	 */
	public void download(String remoteFileName,String locaFileName){
		fpFtpTemplate.download(remoteFileName, locaFileName);
	}
	/**创建文件夹
	 * @param remotePathName 远程文件夹名称
	 */
	public void mkdir(String remotePathName) {
		fpFtpTemplate.mkdir(remotePathName);
	}
	
}


FtpInvoke:

package com.demo.ftp;

import org.apache.commons.net.ftp.FTPClient;

/**ftp操作
 * @author wobendiankun
 *2015-1-22 下午08:27:12
 */
public interface FtpInvoke {
	/**
	 * @param ftp
	 * @param remoteFileName
	 * @param locaFileName
	 */
	void doHandle(FTPClient ftp ,String remoteFileName, String locaFileName) throws Exception;
}


FtpTemplate

package com.demo.ftp;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ConnectException;

import org.apache.commons.net.PrintCommandListener;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

/**
* @author wobendiankun 2015-1-22 下午08:27:46
*/
public class FtpTemplate {
/**
* ftp服务器地址
*/
private String server;
/**
* 端口
*/
private int port;
/**
* 用户名
*/
private String username;
/**
* 密码
*/
private String password;

public FtpTemplate(String server, int port, String username, String password) {
this.server = server;
this.port = port;
this.username = username;
this.password = password;
}

/**
* @param ftp
*/
private void connect(FTPClient ftp) throws Exception {
// 连接服务器
ftp.connect(server, port);
int reply = ftp.getReplyCode();
// 是否连接成功
if (!FTPReply.isPositiveCompletion(reply)) {
throw new ConnectException(server + " 服务器拒绝连接");
}
// 登陆
if (!ftp.login(username, password)) {
throw new ConnectException("用户名或密码错误");
}
}

/**
* @param ftp
* @throws Exception
*/
private void setProperty(FTPClient ftp) throws Exception {
ftp.enterLocalPassiveMode();
// 二进制传输,默认为ASCII
ftp.setFileType(FTP.BINARY_FILE_TYPE);
}

/**
* @param ftp
*/
private void logout(FTPClient ftp) throws Exception {
ftp.noop();
ftp.logout();
}
/**
* @param ftp
* @param remoteFileName
* @param locaFileName
*/
private void upload(FTPClient ftp, String remoteFileName,
String locaFileName) throws Exception{
//上传
InputStream input;

input = new FileInputStream(locaFileName);

ftp.storeFile(remoteFileName, input);

input.close();
}

/**
* @param ftp
* @param remoteFileName
* @param locaFileName
*/
private void download(FTPClient ftp, String remoteFileName,
String locaFileName) throws Exception {
OutputStream output = null;
output = new FileOutputStream(locaFileName);
ftp.retrieveFile(remoteFileName, output);
output.close();
}
/**
* @param ftp
* @param remotePathName
*/
private void mkdir(FTPClient ftp, String remotePathName) throws Exception{
ftp.makeDirectory(remotePathName);
}


private void handle(FtpInvoke ftpInvoke, String remoteFileName, String locaFileName) { FTPClient ftp = null; try { ftp = new FTPClient(); ftp.addProtocolCommandListener(new PrintCommandListener( new PrintWriter(System.out), true)); // 连接ftp服务器 connect(ftp); // 设置属性 setProperty(ftp); // 具体操作方法 ftpInvoke.doHandle(ftp, remoteFileName, locaFileName); // 退出 logout(ftp); } catch (Exception e) { e.printStackTrace(); } finally { if (ftp.isConnected()) { try { ftp.disconnect(); } catch (IOException f) { } } } }

/** * 上传文件 * * @param remoteFileName * 远程文件名称 * @param locaFileName * 本地文件名称 */ public void upload(String remoteFileName, String locaFileName) { handle(new FtpInvoke() { @Override public void doHandle(FTPClient ftp, String remoteFileName, String locaFileName) throws Exception { //上传文件 upload( ftp, remoteFileName, locaFileName ); } }, remoteFileName, locaFileName); }

/** * 下载文件 * * @param remoteFileName * 远程文件名称 * @param locaFileName * 本地文件名称 */ public void download(String remoteFileName, String locaFileName) { handle(new FtpInvoke() { @Override public void doHandle(FTPClient ftp, String remoteFileName, String locaFileName) throws Exception { // 下载文件 download(ftp, remoteFileName, locaFileName); } }, remoteFileName, locaFileName); }

/**创建文件夹
* @param remotePathName 远程文件夹名称
*/
public void mkdir(String remotePathName) {
handle(new FtpInvoke() {

@Override
public void doHandle(FTPClient ftp, String remoteFileName,
String locaFileName) throws Exception {
//创建文件夹
mkdir( ftp, remoteFileName);
}
}, remotePathName, null);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: