使用时间戳修改对象的设计模式
本文关键字:设计模式 对象 修改 时间戳 | 更新日期: 2023-09-27 18:29:00
我有一个对象集合,需要为对象中的某些属性上次更新时维护几个时间戳(每个属性一个时间戳)。
我只想在setter中实现时间戳更新,除了正在使用的反序列化库首先创建一个对象,然后更新它的所有属性(使用对象的setter)。这意味着每当我的程序反序列化它们时,我所有的时间戳都会失效。
我想我需要一个singleton类或一些更新方法来处理属性的更新,并控制时间戳更新。有没有更好的方法来实现这种行为?这种行为是否存在设计模式?
如果您将序列化关注点与业务层分离,这将有助于您找到一些灵活性来敲定解决方案。让99%的API与您的业务对象一起工作(当属性更新时,它会更新时间戳),然后仅转换为某些数据传输对象(DTO)/从某些数据传输目标转换为数据传输对象,以便进行序列化仅。
例如,给定一些业务对象,如下所示:
public class MyObject
{
public DateTime SomeValueUpdated { get; private set; }
private double _SomeValue;
public double SomeValue
{
get
{
return _SomeValue;
}
set
{
SomeValueUpdated = DateTime.Now;
_SomeValue = value;
}
}
public MyObject()
{
}
//for deserialization purposes only
public MyObject(double someValue, DateTime someValueUpdated)
{
this.SomeValue = someValue;
this.SomeValueUpdated = someValueUpdated;
}
}
你可以有这样一个匹配的DTO:
public class MyObjectDTO
{
public DateTime SomeValueUpdated { get; set; }
public double SomeValue { get; set; }
}
您的DTO可以用各种XML模式更改属性进行特殊装饰,或者您可以按照自己认为合适的方式管理时间戳,而您的业务层不知道也不在乎。
当需要序列化或反序列化对象时,请通过转换器实用程序运行它们:
public static class MyObjectDTOConverter
{
public static MyObjectDTO ToSerializable(MyObject myObj)
{
return new MyObjectDTO {
SomeValue = myObj.SomeValue,
SomeValueUpdated = myObj.SomeValueUpdated
};
}
public static MyObject FromSerializable(MyObjectDTO myObjSerialized)
{
return new MyObject(
myObjSerialized.SomeValue,
myObjSerialized.SomeValueUpdated
);
}
}
如果愿意,可以将MyObject
的任何属性或构造函数设置为internal
,这样只有转换实用程序才能访问它们。(例如,您可能不想让public MyObject(double someValue, DateTime someValueUpdated)
构造函数公开访问)