2012-04-09 54 views
1

说我们有一个一流的马铃薯(因此实例),其具有被用于其他方法,但不是假装的公共属性光滑。该属性在创建实例时设置,仅在实例内部使用。设计模式:保存私有成员

而且,我的系统应该支持多种数据库驱动程序,因此我有一个接口“DATABSE适配器”,将与使用我想在目前使用的驱动程序类实例化。

现在出现这个问题。我需要的对象(马铃薯)持续的,并将其保存到数据库中,因此,我通过使用数据库适配器类拯救我们的土豆的平滑度,但..它是私有的! 如何发送马铃薯的平滑度,而不使其用于其他用途访问?

预先感谢

+2

如何平滑属性决定?如果它来自其他属性,则不需要存储它。如果不是,那么它从哪里来? – mellamokb 2012-04-09 21:20:29

+2

实现访问 – zerkms 2012-04-09 21:20:56

+0

你有没有想过使用私人二传手?这样,平滑度不能由实例外的任何人设置,但可以检索。任何类(包括数据库适配器)都需要读取此值才能写入数据库。 – 2012-04-09 21:23:02

回答

2

编写一种方法,允许对象以某种类型的作者为参数保存自己。由于这是一个数据库,因此您可能需要同时具有插入和更新方法,而不仅仅是一个Save方法。您也可以将它们放入界面中。

粗糙例如:

public interface IDatabaseSaveable 
{ 
    void InsertToDatabase(Database pDatabase); 
    void UpdateDatabase(Database pDatabase); 
} 

public class Potato : IDatabaseSaveable 
{ 
    private int mID; 
    private double mSmoothness; 

    public void InsertToDatabase(Database pDatabase) 
    { 
     pDatabase.InsertToPotatoes(mID, mSmoothness, ...); 
    } 

    public void UpdateDatabase(Database pDatabase) 
    { 
     pDatabase.UpdatePotatoes(mID, mSmoothness, ...); 
    } 
} 
1

这是在具有标记为internal的平滑度的性质的变化。假设马铃薯在使用前必须有一个smoothness,那么内部构造函数可能会更好。我会相信,有一个很好的理由来隐藏顺畅。也许对土豆方面谦虚?

public class Potato 
{ 
    internal int Smoothness { get; set; } 

    internal Potato(int smoothness) 
    { 
     this.Smoothness = smoothness; 
    } 
    private Potato() { } 
} 

同一程序只有类可以使用内部的构造方法实例Potato。并且只有同一个程序集中的类才能访问Smoothness(以便他们可以保存马铃薯)。

2

您可以创建一个导入/导出接口,一对外部化的Potato的“状态”没有给访问它的实现细节(在这种情况下,它的私有成员和数据类型)。他们是建设者的类型。

public class Potato { 
    public interface IExporter { 
    void AddSmoothness(string value); 
    } 
    public interface IImporter { 
    string ProvideSmoothness(); 
    } 

    public Potato(IImporter importer) { 
    this.smoothness = int.Parse(importer.ProvideSmoothness()); 
    } 

    public void Export(IExporter exporter) { 
    exporter.AddSmoothness(this.smoothness.ToString()); 
    } 

    public Potato(int smoothness) { 
    this.smoothness = smoothness; 
    } 

    private int smoothness; 
} 

然后,你的数据库适配器类将实施的相关接口,并使用相应的方法。看原始创意here