我正在研究一些简单的自定义流水线代码,我希望在IProcessor
和IProcessorComposite
上实现缓存装饰器 - 后者是管道类的接口(未显示)这里包含并执行多个处理器。
但是IProcessorComposite
使用IProcessor
和Add()
方法扩展了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();
}
}