策略模式
策略模式的核心在于定义一系列算法,把它们封装起来,并且让它们能够相互替换。策略模式让算法的变化独立于使用算法的客户端。在这个方法里,策略模式的体现如下:
convertFunc
参数 :这是一个委托类型的参数,其类型为Func<BaseResponse, TResponse>
。它代表一种转换策略,也就是把BaseResponse
类型的对象转换成TResponse
类型的对象。不同的转换逻辑可以通过传入不同的convertFunc
来实现。isValidFunc
参数 :同样是委托类型,类型为Func<TResponse, bool>
。它代表一种验证策略,用来判断转换后的TResponse
对象是否有效。不同的验证逻辑可以通过传入不同的isValidFunc
来实现。
模板方法模式
模板方法模式定义了一个操作中的算法骨架,把一些步骤的实现延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。在这个方法里,模板方法模式的体现如下:
- 方法的整体逻辑 :
ProcessResult
方法定义了处理结果的整体流程,像是转换响应对象、验证响应对象、更新总体结果等步骤。这些步骤的顺序和基本逻辑是固定的,相当于模板方法模式中的算法骨架。 - 可变部分交给委托 :而具体的转换和验证逻辑则通过
convertFunc
和isValidFunc
这两个委托来实现,这类似于模板方法模式中把某些特定步骤的实现延迟到子类中。
代码示例解释
以下是一个简化的代码示例,展示了如何创建 ProcessResult
方法:
cs
public class ResultProcessor
{
private readonly GjpClient _gjpClient;
//GjpClient 这是请求数据库的接口 为了日志使用可不要
public ResultProcessor(GjpClient gjpClient)
{
_gjpClient = gjpClient;
}
public bool ProcessResult<TResponse>(BaseResponse baseResponse, string operationName, string itemName,
Func<BaseResponse, TResponse> convertFunc, Func<TResponse, bool> isValidFunc,
out TResponse response, ref bool overallResult)
where TResponse : new()
{
response = new TResponse();
if (baseResponse == null)
{
LogError(operationName, itemName, "baseResponse为空!", ref overallResult);
return false;
}
if (baseResponse.status.ToLower() != "success")
{
LogError(operationName, itemName, "失败信息:" + string.Join(",", baseResponse.messages), ref overallResult);
return false;
}
response = convertFunc(baseResponse);
if (!isValidFunc(response))
{
LogError(operationName, itemName, "响应对象为空或关键信息无效!", ref overallResult);
return false;
}
LogSuccess(operationName, itemName, ref overallResult);
return true;
}
private void LogError(string operationName, string itemName, string errorMessage, ref bool overallResult)
{
_gjpClient.AddLog(TurnLog(operationName, "【" + itemName + "】" + operationName + "失败: " + errorMessage, false, "-1", itemName));
overallResult = false;
}
private void LogSuccess(string operationName, string itemName, ref bool overallResult)
{
_gjpClient.AddLog(TurnLog(operationName, "【" + itemName + "】" + operationName + "成功!", true, "0", itemName));
}
private Log TurnLog(string Operation, string Message, bool Success, string Code, string UserCode)
{
Log log = new Log();
log.RequestTime = DateTime.Now;
log.Operation = Operation;
log.Message = Message;
log.Success = Success;
log.Code = Code;
log.UserCode = UserCode;
return log;
}
}
使用示例解释
以下是一个简化的代码示例,展示了如何使用 ProcessResult
方法:
cs
class Program
{
static void Main()
{
ResultProcessor processor = new ResultProcessor();
//一般为基类
BaseResponse baseResponse = new BaseResponse();
bool overallResult = false;
CustomResponse customResponse;
//OperationName和ItemName可不需要 因为后续是记录日志使用 不需要日志可忽略这两个参数
bool result = processor.ProcessResult(
baseResponse,
"OperationName",//方法名 比如上传商品
"ItemName", //编号 比如商品编号
br => br.data as CustomResponse ,//BaseResponse中的data转类型 不同方法中可转不同类型
ir => ir != null && ir.id > 0,//customResponse需要判断的逻辑 比如不为空和ID>0
out customResponse,//输出结果 后续可以使用
ref overallResult);//输出是否成功
Console.WriteLine($"Result: {result}, Overall Result: {overallResult}");
}
}
public class BaseResponse
{
/// <summary>
/// 是否正确处理请求,返回success或error,不区分大小写
/// </summary>
public string status { get; set; }
/// <summary>
/// 处理结果的消息
/// </summary>
public List<string> messages { get; set; }
/// <summary>
/// 业务处理的错误代码,参见错误代码表
/// </summary>
public int errorCode { get; set; }
/// <summary>
/// 实体信息
/// </summary>
public object data { get; set; }
}
public class CustomResponse
{
/// <summary>
/// id
/// </summary>
public int id{ get; set; }
}
在这个示例中,convertFunc
把 BaseResponse
转换为 CustomResponse
,isValidFunc
验证 CustomResponse
是否有效。ProcessResult
方法定义了处理的整体流程,而具体的转换和验证逻辑则通过委托传入。
综上所述,ProcessResult
方法结合了策略模式和模板方法模式的思想,提高了代码的灵活性和可维护性。