有没有办法用一个装饰器类来装饰多个类 - 一些带有扩展接口?

时间:2018-02-28 11:37:09

标签: c# .net interface decorator

我正在研究一些简单的自定义流水线代码,我希望在IProcessorIProcessorComposite上实现缓存装饰器 - 后者是管道类的接口(未显示)这里包含并执行多个处理器。

但是IProcessorComposite使用IProcessorAdd()方法扩展了Remove(),这两种方法都应该通过装饰器公开...

有没有办法可以用一个装饰器类来做到这一点?或者在这种情况下通常最好的DRY方法是什么?

我应该只实现最宽的接口,并在装饰器上调用方法时抛出异常来装饰具有较窄接口的类吗?

我正在处理的(未完成的)代码的一部分:

interface IProcessor<TIn, TOut>
{
    TOut Process(TIn input, TOut output = default(TOut));
}

interface IProcessorComposite<TIn, TOut> : IProcessor<TIn, TOut>
{
    IProcessorComposite<TIn, TOut> Add(IProcessor<TIn, TOut> processor);
    IProcessorComposite<TIn, TOut> Remove(IProcessor<TIn, TOut> processor);
}

interface IProcessorCache<TIn, TOut>
{
    void Remove(TIn key);
    void Add(TIn key, TOut value);
    void Update(TIn key, TOut newValue);
    void Flush();
    IProcessor<TIn, TOut> Processor { get; }
}

class ProcessorCache<TIn, TOut> : IProcessor<TIn, TOut>, IProcessorCache<TIn, TOut>
{
    protected Dictionary<TIn, TOut> _cache = new Dictionary<TIn, TOut>();
    public IProcessor<TIn, TOut> Processor => _decorated;
    protected IProcessor<TIn, TOut> _decorated;

    public TOut Process(TIn input, TOut output = default(TOut))
    {
        TOut value = _cache.GetValueOrDefault(input);

        // If not cached, get fresh one and cache it
        if (value.Equals(default(TOut)))
        {
            value = _decorated.Process(input, output);
            Add(input, value);
        }

        output = value;
        return output;
    }

    public ProcessorCache(IProcessor<TIn, TOut> decorated)
    {
        _decorated = decorated;
    }

    public void Remove(TIn key)
    {
        _cache.Remove(key);
    }

    public void Add(TIn key, TOut value)
    {
        _cache.Add(key, value);
    }

    public void Update(TIn key, TOut newValue)
    {
        if (_cache.ContainsKey(key))
            _cache[key] = newValue;
    }

    public void Flush()
    {
        _cache.Clear();
    }
}

0 个答案:

没有答案