Я не уверен, что я полностью понимаю проблему, однако из того, что вы описали, я, вероятно, имею фильтр и Sender
оба реализуют (или предоставляют экземпляр) Поток с CanRead , возвращающим false.
Для фильтра потребуется экземпляр Sender
для чтения байтов, поэтому фильтр должен наследовать от некоторого базового класса, который позволил бы кому-то предоставить источник Stream
, что-то вроде:
public abstract class FilterBase : Stream
{
private readonly Stream sender;
protected Stream Sender
{
get { return sender; }
}
public FilterBase(Stream sender)
{
this.sender = sender;
}
}
Чтобы «зарегистрировать» фильтр у отправителя, вы просто предоставляете экземпляр Stream
, из которого фильтр должен читать байты.
Точно так же, чтобы «Зарегистрировать» фильтр в Приемнике, просто дайте ему экземпляр Stream
(фильтр), из которого он должен читать байты. (В качестве альтернативы вы можете предоставить Type
и заставить получателя / отправителя создать экземпляр фильтра - это бит, на котором я нечеткий).
Это позволяет легко объединять любое количество фильтров.
Для удобства FilterBase
может реализовывать многие из методов и свойств Stream
(большинство из них просто выбросит NotSupportedException
в любом случае).
В качестве альтернативы вы можете определить свой собственный интерфейс IStream
(или IFilter
), который использует только те методы, которые использует получатель, но я все равно использовал бы тот же шаблон цепочки, в котором вы «регистрируете» отправителя / получателя с помощью фильтровать, предоставляя экземпляр IStream
.
Конечно, это работает, только если Receiver
извлекает байты из Sender
- если Sender
вместо этого переводит байты в Receiver
, тогда вашему фильтру потребуется реализовать Write
методы потока вместо Read
методы и Receiver
должны наследовать (или предоставлять) Stream
.
Вы также можете сделать и то, и другое, если это необходимо, если Sender
и Reciever
наследуют (или предоставляют) Stream
. Это может сбить с толку любого, кто применяет фильтр: методы Write
- это сообщения, которые нужно отправить получателю, а методы Read
- это запросы на чтение от отправителя. Возможно, вы захотите создать свой собственный интерфейс (ы), чтобы было ясно, каковы роли, однако опять-таки я бы следовал тому же шаблону - только с разными именами методов.