问题描述
我使用装饰器模式装饰了以下遗留接口和类:
public interface ISetting : ICloneable
{
string Name;
// other properties and stuff
}
public class StringSetting : ISetting
{
public string Name {get; set;};
public string Value {get; set;}
// other properties and stuff
}
这里是两个对应的装饰器类
public abstract class SettingsDecorator : ISetting,INotifyPropertyChanged
{
private readonly ISetting setting;
public string Name => setting.Name;
}
public class StringSettingDecorator : SettingsDecorator
{
private StringSetting stringSetting;
public string Value // this is an example for the decoration: we added INotifyPropertyChanged
{
get
{
return stringSetting.Value;
}
set
{
stringSetting.Value = value;
InvokePropertyChanged("Value");
}
}
现在我有以下情况:我正在使用我的 StringSettingDecorator
类,在某些时候我必须将 ISetting
的集合提供给一些遗留代码,在那里它被转换为不同的类实例实现 ISetting
的类:
private void SomeLegacyCode(ISetting mySetting)
{
var stringSetting = mySetting as StringSetting;
if (stringSetting != null)
{
return;
}
// actual work done
}
显然这里 stringSetting
总是 null
,因为我给它的实例是 StringSettingDecorator
而不是 StringSetting
。据我所知 - 由于我无法更改遗留代码,因此无法更改装饰器模式 - 我有以下选项:
-
在我的装饰器类中有一些自定义转换功能,允许转换到原始类(请阅读,as
关键字不能被重载) - 在将对象发送到遗留代码之前准备对象,而无需更改装饰器类
- 向装饰器类添加一个功能,该类返回底层
StringSetting
实例并在将对象发送到旧代码之前以这种方式准备对象。
以下哪个是最佳选择……为什么?有没有更好的方法来处理这样的问题(我必须承认,这是第一次实现这种模式,所以我还不能 100% 确定我的实现)
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)