c# - 在这种情况下使用什么设计模式?

标签 c# design-patterns

我有 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 */ }
}

如果我没记错的话,这就是所谓的策略模式。

编辑: juunas 是对的,它是模板方法模式。在 Gamma et al. 中,Template Method 直接在 Behavioral Patterns 章节的 Strategy 之后描述。

关于c# - 在这种情况下使用什么设计模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40461448/

相关文章:

c# - 为什么 C# 不允许将泛型类型用作泛型类中的属性?

design-patterns - 状态机设计模式

java - Web 服务客户端设计模式(最佳实践)

c# - 堆栈溢出的可能原因

c# - Math.Round 圆我

c# - 命名空间和物理项目结构的重构工具

c# - 从文件中动态读取资源

c++ - 事件监听器的最佳设计模式

html - 导航栏是否应该始终以列表的形式实现?

javascript - 更新 JavaScript 对象创建模式