管理对象状态/设置的模式?

时间:2010-05-26 16:40:03

标签: c# design-patterns oop

我遇到了一些困境,并希望得到一些意见。

我有这个类,让我们称它为“Car”,其中每个实例都有一些单独的设置(通过属性),如“Color”,“HasGearShift”或诸如此类(我正在为一个简单的例子做这个)。这些应该是用户可自定义的,但也应该有默认值。

因此,自然的解决方案是获取所有“设置”属性并将它们分解为可以序列化/反序列化的单独“设置”类。每个Car类还可以继承Settings类,其中一个类设置默认值,并且可以序列化为用户自定义的基础。 Sofar很好。

我觉得问题是我要么必须在整个代码中使用这种语法:someCar.Settings.HasGearShift还有一些像这样:someCar.Settings.GearBox.CurrentGear但是至少没有冗余,一切都是很好地封装在Settings类中。

另一个选项是将属性保留在Car类上,只需将它们从Settings类复制到类中即可。然后我可以再简单地写someCar.HasGearShift。使引用属性更简洁,但意味着如果我添加/删除某些内容,我必须更改两个类中的设置。

你会选择哪一个,或者我错过了第三个更好的方法?我倾向于第二种选择,否则代码中只会出现太多“火车残骸”:)

3 个答案:

答案 0 :(得分:6)

我想我会在两者之间寻找一些东西:使用合成并使用所需的设置制作CarSettings类,并使其可序列化。也许有一个静态的CarSettings.Default属性;它定义了默认设置。然后Car可以在构造函数中获取设置实例,并公开设置的委托属性,这些属性需要在外部可见。

有些事情:

public class Car
{
    private CarSettings settings;

    public Car(CarSettings settings) 
    {
        settings = settings ?? CarSettings.Default;
    }

    public string Color { get {return settings.Color;} }
}

public class CarSettings 
{
     public string Color {get; private set;}
     public static CarSettings Default = new CarSettings {Color = "Red"};
}

答案 1 :(得分:0)

您可以查看Visual Studio Win-forms设计器使用的现有设计:

Public Property AlternateItemColors() As Boolean Implements AbstractInterfaces.CoreControls.IVisualList.AlternateItemColors
    Get
        Return m_AlternateItemColors
    End Get
    Set(ByVal value As Boolean)
        m_AlternateItemColors = value
    End Set
End Property

Public Overridable Function ShouldSerializeAlternateItemColors() As Boolean
    If Me.AlternateItemColors = True Then Return False
    Return True
End Function

他们也使用了许多属性,比如;的默认值

答案 2 :(得分:0)

我不确定我在这里看到问题。似乎你唯一的问题是你不喜欢深层嵌套的属性。这不是一个真正的问题,当您需要访问设置时,您可以轻松地在代码中执行此操作:

var settings = someCar.Settings;
settings.Color...

我想说的是,你的设计似乎很好,你担心的长语法不是问题。