c#模板方法,在运行时改变逻辑
本文关键字:改变 运行时 模板方法 | 更新日期: 2023-09-27 18:13:13
我正在用c#类编写一个方法,如下所示:
using(sftpClient)
{
sftpClient.Connect();
try{
//Do some process
}
catch(Exception ex)
{
}
sftpClient.Disconnect();
}
我需要创建一些类似于上面的方法,但逻辑只在try{} catch{}块内改变。谁能提出一些使用设计模式实现这一目标的最佳方法?
您可以创建一个抽象基类:
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();
}