在 C# 的遗留代码中使用装饰器类的好做法是什么?

问题描述

我使用装饰器模式装饰了以下遗留接口和类:

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 (将#修改为@)