Я бы, вероятно, просто избавился от класса 'control' и связал отдельные обработчики напрямую друг с другом - в основном, использовал бы больше подхода IoC.
Пример (в C #, простите) за запрос ...
public interface IIntMessage
{
void HandleMesasge(int i);
}
public class EvenPrinter : IIntMessage
{
private IIntMessage m_next;
public EvenPrinter(IIntMessage next)
{
m_next = next;
}
public void HandleMesasge(int i)
{
if(i % 2 == 0)
{
System.Console.WriteLine("Even!");
}
else
{
m_next.HandleMesasge(i);
}
}
}
public class OddPrinter : IIntMessage
{
private IIntMessage m_next;
public OddPrinter(IIntMessage next)
{
m_next = next;
}
public void HandleMesasge(int i)
{
if(i%2 == 1)
{
System.Console.WriteLine("Odd!");
}
else
{
m_next.HandleMesasge(i);
}
}
}
Обратите внимание, что мы полностью избавляемся от "управляющего" класса и просто позволяем обработчикам запросов напрямую связываться друг с другом, не обращаясь к посреднику.
Кроме того, я мог бы, вероятно, извлечь «базовый» обработчик запроса цепочки команд, удалив часть дублирующего кода.