gpt4 book ai didi

oop - 将多种数据格式从多个来源转换为单一格式的设计模式

转载 作者:行者123 更新时间:2023-12-05 01:28:35 27 4
gpt4 key购买 nike

我在一家拥有多个网站的公司工作,而现有的基础设施……好吧,太糟糕了。

现在,每个商店都有自己的表格,其结构各不相同。这正在迅速成为一个问题(如果还没有的话)。

所以我需要找到一种方法来从多个 channel 获取订单,将它们格式化为单一、统一的方式,将它们存储在我们的端,并将它们转换回商店 API 期望的格式(可以是来自RESTful JSON 到 SOAP)。

我最初的直觉 react 是工厂模式、访问者模式和构建器模式的混合体(加上一些智能多态性),但它变得有点太复杂太快了。在我使用可能不是最优、不可维护或不可扩展的解决方案将自己编码到一个角落之前,是否有一种模式或一组模式会更有效?

基本上,我认为它会是这样的:

Source -> Translator -> Our Format
Our Format -> Translator -> Source

我不需要翻译人员对数据进行实际操作。它应该负责的是以正确的格式获取它,我们可以从 A 点到 B 点(反之亦然)获取它。

关于系统的一些假设:

  1. 我们端的格式不太可能改变,因此我们的对象也不太可能改变
  2. 当数据被翻译回原始来源时,我们可以假设所需的一切都在那里。出站请求的实际行为是小的、集中的和明确的

最佳答案

Adapter Pattern是你的 friend 。假设您有一个遗留的 Customer 类。

public class CustomerLegacy
{
public string FirstName { get; set; }

public string LastName { get; set; }

public DateTime Birthday { get; set; }
}

您可能想要做的第一件事是提取该类。此步骤是可选的,但它使新类可测试。因此,您将拥有如下所示的 ICustomerLegacy 界面。

public interface ICustomerLegacy
{
string FirstName { get; set; }

string LastName { get; set; }

DateTime Birthday { get; set; }
}

然后重构CustomerLegacy类来实现新的接口(interface)。

public class CustomerLegacy
: ICustomerLegacy

下一步是创建一个将 ICustomerLegacy 作为构造函数参数的适配器。您可以添加新属性以满足您的需求。

public class CustomerAdapter
{
private readonly ICustomerLegacy customer;

public CustomerAdapter(ICustomerLegacy customer)
{
this.customer = customer;
}

public string FullName
{
get
{
return this.customer.FirstName + " " + this.customer.LastName;
}
}

public int Age
{
get
{
return DateTime.UtcNow.Year - this.customer.Birthday.Year;
}
set
{
// your logic here.
}
}

public void Save()
{
//this.customer.DoSomething();
}
}

如您所见,适配器模式可以帮助您重构现有产品,使其可测试,并在一处整理遗留代码。

关于oop - 将多种数据格式从多个来源转换为单一格式的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30448854/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com