引入模板模式重构FtpClientUtil
来源:互联网 发布:三力网络酒店客控 编辑:程序博客网 时间:2024/05/17 06:01
在《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() {@Overridepublic 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() {@Overridepublic 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();// 二进制传输,默认为ASCIIftp.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() {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic void doHandle(FTPClient ftp, String remoteFileName,String locaFileName) throws Exception {//创建文件夹mkdir( ftp, remoteFileName);}}, remotePathName, null);}}
0 0
- 引入模板模式重构FtpClientUtil
- 机房重构之模板方法模式
- 重构 - 理解设计模式的捷径(3 设计模式的引入 - 状态模式)
- 重构 - 理解设计模式的捷径(4 设计模式的引入 - 工厂模式)
- 重构:引入NULL对象
- iPhone开发重构:提取类以构成模板模式
- 重构机房收费系统之 模板方法模式
- 重构个人版机房收费系统——模板模式
- 机房重构组合查询之模板模式
- 【机房重构】模板方法模式应用—组合查询
- 《重构》 — Java示例:影片出租店程序(6、重构——引入状态模式)
- 《重构》 — Delphi示例:影片出租店程序(6、重构——引入状态模式)
- 重构模板引擎
- 机房重构——模板方法模式+单例模式+存储过程优化组合查询
- FTPClientUtil FTP客户端工具
- 机房重构模板方法
- 机房重构--模板方法
- php重构优化一例——模板方法模式应用
- 基础MySQL语句
- PPP和PPPoE的工作原理
- bash中 2>&1 & 的解释
- redis各种类型的存储情况分析
- Android下拉菜单Spinner控件
- 引入模板模式重构FtpClientUtil
- 材质模型
- zoj 1666 Square Coins
- STL容器特征总结和迭代器失效
- xml
- 把Vim改装成一个IDE编程环境(图文)
- libevent学习四
- 20070224-ROIPOLY – rectangular regions and logical indexing
- zoj 1713 Haiku Review