类之间是否存在转换模式



我有一个来自本机库的类,我想转换为我自己的类型,我需要在几个地方做到这一点。然后,我创建了一个静态方法,所以我不需要在很多地方重复类的实例化,但不知何故,它似乎不正确。

如果需要从8种不同类型创建转换,我会在Record中使用8种不同的转换方法。

这是最好的方法吗,还是有任何已知的模式涵盖了这个主题?

class Record
{
public String Id { get; set; }
public String FirstName { get; set; }
public String LastName { get; set; }
public String FingerPrints { get; set; }
//
// This is a simplification of the method and in fact, I created several of
// them, and the class doesn't look clean anymore.
//
public static Record CreateFromMaciRecord(MaciRecord maci)
{
return new Record
{
Id = maci.GetRecordId(),
FirstName = Encoding.UTF8.GetString(maci.GetUserDataField("first_name")),
LastName = Encoding.UTF8.GetString(maci.GetUserDataField("name"))
};
}
}

如果您不想要构造函数或静态工厂方法,可以引入扩展方法。例如

static class Conversions
{
public static Record ToRecord(this MaciRecord maci) => new Record
{
Id = maci.GetRecordId(),
FirstName = Encoding.UTF8.GetString(maci.GetUserDataField("first_name")),
LastName = Encoding.UTF8.GetString(maci.GetUserDataField("name"))
};
}

你会称之为

var maciRecord = ...;
var record = maciRecord.ToRecord();

您可以始终在Record中提供隐式转换,只需执行:

Record record = someMaciRecord;

将其添加到Record

public static implicit operator Record(MaciRecord maci) 
{
return new Record
{
Id = maci.GetRecordId(),
FirstName = Encoding.UTF8.GetString(maci.GetUserDataField("first_name")),
LastName = Encoding.UTF8.GetString(maci.GetUserDataField("name"))
};
}

如果您的Record正在转换MaciRecord的接口以便与应用程序的其他部分一起工作,那么我建议您使用class或Object Adapter GOF设计模式。如果Record正在为MaciRecord添加新功能,那么这是Decorator GOF设计模式的机会。我们必然要求包装器覆盖MaciRecord。这里需要注意的是,这两种设计模式也被称为Wrapper

相关内容

  • 没有找到相关文章