Oop 用于将多个数据源中的多种数据格式转换为单一格式的设计模式
我在一家拥有多个网站的公司工作,而现有的基础设施……嗯,糟糕透了 现在,每个商店都有自己的表,表的结构各不相同。这正迅速成为一个问题(如果还没有的话) 因此,我需要找到一种方法,从多个渠道接收订单,将它们格式化为一种统一的方式,在我们的终端存储它们,并将它们转换回StoreAPI所期望的格式(可以是从RESTful JSON到SOAP的所有内容) 我最初的直觉反应是工厂、访客和建筑商模式的混合(再加上一些智能多态性),但它变得有点太复杂太快了。在我用可能不是最优的、可维护的或可扩展的解决方案将自己编码到一个角落之前,是否有一种模式或一组模式更有效 基本上,我认为应该是这样的:Oop 用于将多个数据源中的多种数据格式转换为单一格式的设计模式,oop,design-patterns,ooad,Oop,Design Patterns,Ooad,我在一家拥有多个网站的公司工作,而现有的基础设施……嗯,糟糕透了 现在,每个商店都有自己的表,表的结构各不相同。这正迅速成为一个问题(如果还没有的话) 因此,我需要找到一种方法,从多个渠道接收订单,将它们格式化为一种统一的方式,在我们的终端存储它们,并将它们转换回StoreAPI所期望的格式(可以是从RESTful JSON到SOAP的所有内容) 我最初的直觉反应是工厂、访客和建筑商模式的混合(再加上一些智能多态性),但它变得有点太复杂太快了。在我用可能不是最优的、可维护的或可扩展的解决方案将自
Source -> Translator -> Our Format
Our Format -> Translator -> Source
我不需要译者对数据进行实际操作。它所应该负责的就是以正确的格式获取它,我们可以从A点到B点获取它(反之亦然)
关于系统的一些假设:
public class CustomerLegacy
{
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime Birthday { get; set; }
}
您可能要做的第一件事是提取该类的。此步骤是可选的,但它使新类可测试。因此,您将拥有如下所示的ICCustomerLegacy接口
public interface ICustomerLegacy
{
string FirstName { get; set; }
string LastName { get; set; }
DateTime Birthday { get; set; }
}
然后重构CustomerLegacy
类以实现新接口
public class CustomerLegacy
: ICustomerLegacy
下一步是创建一个将icCustomerLegacy
作为构造函数参数的适配器。您可以添加新属性以满足您的需要
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();
}
}
正如您所见,适配器模式可以帮助您重构现有产品,使其可测试,并在一个地方整理遗留代码。据我所知,您应该能够使用一种简单的方法来处理这种情况,使用工厂和接口
class IStore
{
void Place(Order order);
....other methods
}
class AmazonStore : IStore
{
...implement methods
}
class EbayStore : IStore
{
...implement methods
}
在这里,Order对象应该被转换为实际实现中的特定API,对于任何获取数据的方法,也应该被转换为特定API
然后,可以使用工厂根据常量或枚举创建相关存储。在我以前的一家公司,我们曾从事过类似的项目。我们采用这种架构 使用“管道和过滤器”体系结构样式将较大的处理任务划分为一系列由通道(管道)连接的较小、独立的处理步骤(过滤器) 每个筛选器都公开了一个非常简单的接口:它在入站管道上接收消息,处理消息,并将结果发布到出站管道。管道将一个过滤器连接到下一个过滤器,将输出消息从一个过滤器发送到下一个过滤器。因为所有组件都使用相同的外部接口,所以通过将组件连接到不同的管道,可以将它们组合成不同的解决方案。我们可以添加新的过滤器,省略现有的过滤器,或者将它们重新排列成新的序列——所有这些都不需要更改过滤器本身。过滤器和管道之间的连接有时称为端口。在基本形式中,每个过滤器组件都有一个输入端口和一个输出端口 把它想象成你的
源代码
是泵,你的翻译器
是过滤器。过滤器中的任何功能都将从相应的业务域驱动。大局是这样的: