使用时间戳修改对象的设计模式

本文关键字:设计模式 对象 修改 时间戳 | 更新日期: 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)构造函数公开访问)