c#模板方法,在运行时改变逻辑

本文关键字:改变 运行时 模板方法 | 更新日期: 2023-09-27 18:13:13

我正在用c#类编写一个方法,如下所示:

using(sftpClient)
{
    sftpClient.Connect();
    try{
        //Do some process
    }
    catch(Exception ex)
    {
    }
    sftpClient.Disconnect();
}

我需要创建一些类似于上面的方法,但逻辑只在try{} catch{}块内改变。谁能提出一些使用设计模式实现这一目标的最佳方法?

c#模板方法,在运行时改变逻辑

您可以创建一个抽象基类:

abstract class MyBaseClass {
   protected abstract void DoSomething();
   public void DoSmtpStuff() {
       smtpClient.Connect();
       try {
           DoSomething();
       } catch (Exception ex) {
       }
       smtpClient.Disconnect();
   }
}

,然后创建该类的继承,它只实现DoSomething方法。

看一下Strategy Pattern(强调我自己的):

在计算机编程中,策略模式(也称为策略模式)是一种软件设计模式,它支持算法的行为在运行时选择。

基本上,你可以声明一个接口,比如IBehaviour并定义一些方法:

public interface IBehaviour
{
    void Process();
}

然后有一个不同的类实现IBehaviour为您想要的每一块逻辑。

需要使用逻辑的类将允许传递IBehaviour对象,而在try块中只执行behaviour.Process()

这将允许您从类外部设置行为,然后简单地将其传递给您想要对其进行实际操作的类。

类的替代方法是将Action作为参数:

TResult WithSftpClient<TResult>(Func<TResult, SftpClient> operation)
{
  TResult result = default(TResult);
  // Note that one may need to re-create "client" here 
  // as it is disposed on every WithSftpClient call -
  // make sure it is re-initialized in some way.
  using(sftpClient)
  {
    sftpClient.Connect();
    try
    {
        result = operation(sftpClient);
    }
    catch(Exception ex)
    {
       // log/retrhow exception as appropriate
    }
    // hack if given class does not close connection on Dispose
    // for properly designed IDisposable class similar line not needed
    sftpClient.Disconnect(); 
  }
  return result;
}

并使用它:

  var file = WithSftpClient(client => client.GetSomeFile("file.name"));

你可以使用这个模式:

abstract class ProcedureBase<T>
{
    public T Work()
    {
        using(sftpClient)
        {
            sftpClient.Connect();
            try{
                ProtectedWork();
            }
            catch(Exception ex)
            {
            }
            sftpClient.Disconnect();
        }
    }
    protected abstract T ProtectedWork();
}

class Procedure1 : ProcedureBase<TypeToReturn>
{
    protected override TypeToReturn ProtectedWork()
    {
        //Do something
    }
}
class Procedure2 : ProcedureBase<AnotherTypeToReturn>
{
    protected override AnotherTypeToReturn ProtectedWork()
    {
        //Do something
    }
}

用法:

static void Main(string[] args)
{
    Procedure1 proc = new Procedure1();
    proc.Work();
}