访问者模式的经典使用。尽管您有时会看到更通用的模式表达,但这里有一些通过访问者模式的持久层的伪代码。
注意,首选项不需要知道如何保存自己,只需将自己传递给存储机制即可:
abstract BasePreference
{
abstract Persist(PreferenceStorage ps);
}
NumericPreference : BasePreference
{
string Name;
int Value;
int Default
Persist(PreferenceStorage ps)
{
ps.Save(this);
}
}
StringPreference : BasePreference
{
string Name;
string Value;
string Default
Persist(PreferenceStorage ps)
{
ps.Save(this);
}
}
DateRangePreference : BasePreference
{
string Name;
DateTime StartOfRange;
DateTime EndOfRange;
DateTime DefaultStartOfRange;
DateTime DefaultEndOfRange;
Persist(PreferenceStorage ps)
{
ps.Save(this);
}
}
接下来,PreferenceStorage 利用方法重载来允许为每个 pref 子类型运行单独的代码。类型上没有开关块:
abstract PreferenceStorage
{
abstract void Save(NumericPreference pref);
abstract void Save(StringPreference pref);
abstract void Save(DateRangePreference pref);
}
最后,PreferenceStorage 的子类负责处理机制或保存数据:
XmlPreferenceStorage : PreferenceStorage
{
void Save(NumericPreference pref)
{
// save number to xml
}
void Save(StringPreference pref)
{
// save string to xml
}
void Save(DateRangePreference pref)
{
// save date range to xml
}
}
RegistryPreferenceStorage : PreferenceStorage
{
void Save(NumericPreference pref)
{
// save number to registry
}
void Save(StringPreference pref)
{
// save string to registry
}
void Save(DateRangePreference pref)
{
// save date range to registry
}
}
(Uggg,为什么这种格式如此糟糕?抱歉缩进不好,通常在 SO 上很好的代码格式)