我有40个供应商需要建立ftp连接,在那里做一些事情并关闭连接.因此,所有这40个供应商都有自己的类,他们都有ftp服务器的连接和断开连接,但它们都有不同的处理方法.
所以基本上我用这个方法有40个类:
ftp.Connect(); //do something - this is different for all the classes ftp.Close();
所以做某事的部分是不同的,它做不同的事情,它使用不同的变量等.
我认为我会做的是:创建一个将在所有40个供应商中实例化的新类.这个类有一个看起来像这样的方法:
public void Connect(FTPCredentials credentials,Process process) { var ftp = new FtpConnection(credentials.Host,credentials.Username,credentials.Password); ftp.open(); ftp.Login(); process(ftp); ftp.Close(); } public delegate void Process(FtpConnection ftp/*,string name*/);
我在这里遇到的问题是,所有40个供应商的所有方法都有不同的输入参数,那么Process的输入参数是什么?此外,我认为我没有获得太多,因为我仍然有FtpConnection ftp参数,这意味着我将不得不在每个将使用Connect方法的项目中添加具有类FtpConnection的dll.
例如,供应商中的流程方法如下所示:
process(string fileName) //and it would download fileName process(string folderName) //create folder if it doesnt exist
我可以在这里使用的设计模式更干净,会让事情变得更容易吗?
解决方法
我的印象是,这样的对象仅在短时间内用于特定目的.所以我会接受存储在特定派生类中的特定参数.与mybirthname的解决方案类似,我将从一个抽象类开始,但以不同的方式定义它:
public abstract class Basesupplier { protected Basesupplier(FtpCredentials credentials) { _Credentials = credentials; } private FtpCredentials _Credentials; public void Run() { Connect(); Process(); disconnect(); } private void Connect() {/* your connection and login code */} private void disconnect() {/* your disconnect code */} protected abstract void Process(); // to be filled in the derived class } public class Concretesupplier { public Concretesupplier(FtpCredentials credentials,SomeType parameter) : base(credentials) { /* store extra parameters */ } override Process() {/*your concrete processing code */ } }
如果我没记错的话,那叫做战略模式.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。